Java中的SimpleDateFormat方法分析

简介: Java中的SimpleDateFormat方法分析

先进行专栏介绍

本专栏是自己学Java的旅途,纯手敲的代码,自己跟着黑马课程学习的,并加入一些自己的理解,对代码和笔记

进行适当修改。希望能对大家能有所帮助,同时也是请大家对我进行监督,对我写的代码进行建议,互相学习。

SimpleDateFormat方法

在Java中,SimpleDateFormat类是用于日期格式化和解析的类。它位于java.text包中。

分析

SimpleDateFormat SimpleDateFormat是一个用于区域设置敏感的方式格式化和解析日期的具体类

日期和时间格式由日期和时间模式字符串指定,在日期和时间模式字符串中,

从’A’到’Z’以及从‘a’到’z’引号中的字母被解释为表示日期或时间字符串的组成部分的模式字母

常用模式字母 y 年 M 月 d 日 H 时 m 分 s 秒

举例 2021年10月27日11:11:11

模式 yyyy年MM月dd日HH:mm:ss



常用方法

构造方法

SimpleDateFormat():构造一个SimpleDateFormat,使用默认模式和日期 SimpleDateFormat(String pattern): 构造一个SimpleDateFormat使用给定的模式和默认的日期格式

格式化(从Date到String)

String format(Date date):将日期格式化成日期/时间字符串

举例

Date now = new Date();
String formattedDate = sdf.format(now);
System.out.println(formattedDate);

分析

我们使用format()方法将当前日期和时间对象格式化为一个字符串,并将其打印到控制台上。

解析(从String到Date)

Date parse(String source):从给定字符串的开始解析文本以生成日期

举例

String dateStr = "2022-01-01 12:00:00";
Date parsedDate = sdf.parse(dateStr);
System.out.println(parsedDate);

分析

使用parse()方法将一个字符串解析为一个日期对象,并将其打印到控

设置方法:制台上。

void setLenient(boolean lenient):设置解析时是否宽松的解析日期,默认为true,即宽松解析,对于一些不合法的日期也会尝试解析。

void setDateFormatSymbols(DateFormatSymbols newFormatSymbols):设置用于格式化和解析日期的DateFormatSymbols对象,用于指定月份、星期几等的名称。

注意

SimpleDateFormat不是线程安全的。如果多个线程同时使用同一个SimpleDateFormat对象,可能会导致结果不正确。为了解决这个问题,我们可以使用ThreadLocal来确保每个线程都有自己的SimpleDateFormat对象。


是SimpleDateFormat对于日期格式的解析是宽松的。这意味着它会尝试解析不完整或不正确的日期字符串,并返回一个可能不准确的日期对象。为了避免这种情况,我们应该始终使用严格的日期格式,并在解析之前对日期字符串进行验证。


代码示例

代码



import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class crj {
    public static void main(String[] args) {
        //Date():
        Date d1 = new Date();
        System.out.println(d1);
        //Date(long date):  1000(毫秒)*60*60   一小时
        Date d2 = new Date(1000 * 60 * 60);
        System.out.println(d2);
        Date d = new Date();
//        SimpleDateFormat sdf = new SimpleDateFormat();
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        String s = sdf.format(d);
        System.out.println(s);
        System.out.println("-------");
        //解析
        String ss="2021-10-27 11:11:11";
//        SimpleDateFormat sdf2=new SimpleDateFormat("2021年10月27日 11:11:11");
        SimpleDateFormat sdf2=new SimpleDateFormat("2021-10-27 11:11:11");
        Date dd= null;
        try {
            dd = sdf2.parse(ss);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        System.out.println(dd);
    }
}

结果

Wed Aug 09 07:47:56 CST 2023
Thu Jan 01 09:00:00 CST 1970
2023年08月09日 07:47:56
-------
Thu Jan 01 00:00:00 CST 1970



综合案例

import com.itheima_05.DateChooser;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class crj {
    public static void main(String[] args) {
        JFrame jf = new JFrame();
        jf.setTitle("考勤查询");
        jf.setSize(400, 300);
        jf.setDefaultCloseOperation(3);
        jf.setLocationRelativeTo(null);
        jf.setAlwaysOnTop(true);
        jf.setLayout(null);
        //显示考勤日期
        JLabel dataLable = new JLabel("考勤日期");
        dataLable.setBounds(50, 20, 100, 20);
        jf.add(dataLable);
        //开始时间
        JLabel startDateLable = new JLabel("开始时间");
        startDateLable.setBounds(50, 70, 100, 20);
        jf.add(startDateLable);
        DateChooser dateChooser1 = DateChooser.getInstance("yyyy/MM/dd");
        DateChooser dateChooser2 = DateChooser.getInstance("yyyy/MM/dd");
        //开始时间输入框
        JTextField startDateField = new JTextField();
        startDateField.setBounds(50, 100, 100, 20);
        dateChooser1.register(startDateField);
        jf.add(startDateField);
        //结束时间
        JLabel endDateLable = new JLabel("结束时间");
        endDateLable.setBounds(250, 70, 100, 20);
        jf.add(endDateLable);
        //结束时间输入框
        JTextField endDateField = new JTextField();
        endDateField.setBounds(250, 100, 100, 20);
        dateChooser2.register(endDateField);
        jf.add(endDateField);
        //确定按钮
        JButton confirmButton = new JButton("确定");
        confirmButton.setBounds(250, 180, 60, 20);
        jf.add(confirmButton);
        confirmButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
                //获取开始 结束时间
                String startDateString = startDateField.getText();
                String endDateString = endDateField.getText();
                try {
                    Date startDate = sdf.parse(startDateString);
                    Date endDate = sdf.parse(endDateString);
                    JOptionPane.showMessageDialog(jf,startDate+"\n"+endDate);
                } catch (ParseException ex) {
                    ex.printStackTrace();
                }
            }
        });
        jf.setVisible(true);
    }
}

效果

相关文章
|
12月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
651 18
|
Java Go 开发工具
【Java】(9)抽象类、接口、内部的运用与作用分析,枚举类型的使用
抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接 口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类abstract static不能同时修饰一个方法。
437 1
|
Java 编译器 Go
【Java】(5)方法的概念、方法的调用、方法重载、构造方法的创建
Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用方法的优点使程序变得更简短而清晰。有利于程序维护。可以提高程序开发的效率。提高了代码的重用性。方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson。这种就属于驼峰写法下划线可能出现在 JUnit 测试方法名称中用以分隔名称的逻辑组件。
461 4
|
存储 Java Go
【Java】(3)8种基本数据类型的分析、数据类型转换规则、转义字符的列举
牢记类型转换规则在脑海中将编译和运行两个阶段分开,这是两个不同的阶段,不要弄混!
463 2
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
608 5
|
算法 安全 Java
除了类,Java中的接口和方法也可以使用泛型吗?
除了类,Java中的接口和方法也可以使用泛型吗?
326 11
|
Java 开发者
Java 函数式编程全解析:静态方法引用、实例方法引用、特定类型方法引用与构造器引用实战教程
本文介绍Java 8函数式编程中的四种方法引用:静态、实例、特定类型及构造器引用,通过简洁示例演示其用法,帮助开发者提升代码可读性与简洁性。
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
|
安全 Java 编译器
new出来的对象,不一定在堆上?聊聊Java虚拟机的优化技术:逃逸分析
逃逸分析是一种静态程序分析技术,用于判断对象的可见性与生命周期。它帮助即时编译器优化内存使用、降低同步开销。根据对象是否逃逸出方法或线程,分析结果分为未逃逸、方法逃逸和线程逃逸三种。基于分析结果,编译器可进行同步锁消除、标量替换和栈上分配等优化,从而提升程序性能。尽管逃逸分析计算复杂度较高,但其在热点代码中的应用为Java虚拟机带来了显著的优化效果。
438 4
|
算法 Java
Java语言实现链表反转的方法
这种反转方法不需要使用额外的存储空间,因此空间复杂度为,它只需要遍历一次链表,所以时间复杂度为,其中为链表的长度。这使得这种反转链表的方法既高效又实用。
753 0