目录
1.4 java.text.SimpleDateFormat类
2.1 LocalDate类、LocalTime类、LocalDateTime类(常用)
2.3 DateTimeFormatter类(相当于SimpleDateFormat)
前言
Date类有些过时了,因为Date类的格式是这样的 “Sat Feb 04 17:11:30 CST 2023”,太难看了,不利于国际上的统一。
于是有了SimpleDateFormat类,专门用来把Date的丑格式,改成自定义的漂亮格式,常用的格式便是“yyyy-MM-dd hh:mm:ss”这样的。
Calendar类用来替代Date类(因为Date类过时嘛),但是Calendar的缺点是不能自定义格式,因为SimpleDateFormat只能规范Date类的格式。
JDK 8后出现了LocalDateTime类取代Date类,DateTimeFormatter类去取代SimpleDateFormat类,同样DateTimeFormatter类是为LocalDateTime类自定义格式用的。
一、JDK 8之前日期类
1.1 java.lang.System类
常用的是System类中的静态方法currentTimeMillis(),返回的是从1970年1月1日0时0分0秒到现在的时间,以毫秒为单位,long型数据。常用来计算时间差,或者某段代码的执行时间。
在项目中可用于生成唯一的名称(比如生成唯一的订单号,Triton项目当时生成的唯一jpg名称),如果每毫秒有多个产出,那还需要搭配随机数一起使之唯一化。
1.2 java.util.Date类
PS:还有一个Date类,是java.sql.Date类,是其子类
java.util.Date
|------java.sql.Date
记忆点:
(1)还能用(不算过时)两个构造器
(2)还能用(不算过时)的两个方法
(3)过时
偏移性:Date中的年份从1900开始,月份从0开始。如果我们要新建一个2020年9月8日的Date类对象,要减去偏移量,所以这种构造方式过时了没人用!
(3)Date类的API由于不易于国际化,已经过时了,它的很多方法都加了“Deprecated”注解。推荐使用Calendar类。
1.3 java.sql.Date类
记忆点:
(1)实例化
(2)如何将java.util.Date类转化为java.sql.Date类
java.sql.Date类对应着sql数据库中date类型的变量。
也就是说,如果我们要和sql进行交互,应该用java.sql.Date这个类去接收。
(1)如何实例化
(2)如何将java.util.Date类转化为java.sql.Date类——运用的是二者方法上的逻辑关系
1.4 java.text.SimpleDateFormat类
由于Date类不易于国际化,SimpleDateFormat便是对Date类的格式化和解析。
记忆点:
(1)实例化
(2)两个常用方法
①格式化format(): 日期Date类------>字符串
②解析(格式化的逆过程)parse():字符串------>日期Date类
(3)异常
用到parse()的方法需要抛出ParseException,当输入的字符串与pattern不匹配就会报这个异常。
由于默认构造器解析出来的格式不顺眼很别扭,我们一般使用有参构造器指定格式进行开发:
- y:年
- M:大写的M代表月份(为了和minutes区分开)
- d 天
- h 小时
- m 分钟
- s秒
在项目开发中,我们一般使用“yyyy-MM-dd hh:mm:ss”这种格式
还可以任意指定其他格式:
1.5 Calendar类
记忆点:
(1)实例化
① 对象上转型。new一个子类对象GregorianCalendar
② 利用Calender类的startic方法getInstance(一般用这个)。
(2)其他常用方法
(3)一月是0,二月才是1;周日是1,周一是2,周六是7
1.实例化
因为Calendar是一个abstract方法,所以本身不能实例化。 实例化的方法有两个
① 对象上转型。new一个子类对象GregorianCalendar
② 利用Calender类的startic方法getInstance(一般用这个)。
2. 其他常用方法
(1)get( )
Calendar类里有很多static final修饰的变量。可以使用类名直接调用这些静态变量,比如Calendar.DAY_OF_WEEK,作为get等方法的参数,获取“今天是一年的第几天”,“一周的第几天”,“一月的第几天”等信息。这些变量并不存储“一年的第几天”等信息,他们只是一个名字或者标志而已。
(2)set( )
不要理解成“把今天改成今年的第1天”,这样很奇怪,因为今天明明是今年的第201天呀。
要理解成吧cal这个对象改成今年的第1天。用途:比如说题目指定了计算2022年1月1日,但是我们实例化的calendar对象却是今天,就可以用set把它改掉。
(3)add( )
cal.add(Calendar.DAY_OF_YEAR,30); //cal往后加30天
System.out.println(cal.get(Calendar.DAY_OF_YEAR));
System.out.println(cal.get(Calendar.YEAR)); //输出2022年
cal.add(Calendar.MONTH,18); //往后加18个月,12个月多出来的加到下一年
System.out.println(cal.get(Calendar.MONTH));
System.out.println(cal.get(Calendar.YEAR)); //输出2023年
calendar并没有minus方法,如果要往前推多少天或者多少月,把数值改成负数就行了。
(4)getTime( ) :calendar类------>Date类
用一个例子来理解其应用:把2021年9月28号打印成yyyy-MM-dd格式输出。思路是“先实例化calendar对象,用YEAR,MONTH,DATE指定月日年,然后Calendar对象--->Date类对象--->SimpleDateFormat类对象”。
cal.set(Calendar.YEAR,2021);
cal.set(Calendar.MONTH,8); //注意,Month=实际月份-1
cal.set(Calendar.DATE,28);
Date date = cal.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(sdf.format(date));
(5)setTime( ) :Date类------>calendar类
Calendar cal = Calendar.getInstance();
Date date = new Date();
cal.setTime(date);
二、JDK 8的日期类
JDK 8之前存在的问题:
(1)可变性:像日期和时间这样的类应该和string一样是不可变的,或者说一旦发生变化就得重新构造一个对象,但是上面Calendar类中我们可以用set方法对对象本身进行改变。
(2)格式化:虽然Date过时了推荐用Calendar,但是SimpleDateFormat只能对Date进行格式化,不能对Calendar格式化。
(3)偏移性:Date中的年份从1900开始,月份从0开始。如果我们要新建一个2020年9月8日的Date类对象,要减去偏移量
(4)缺少synchronize方法,不是线程安全的
(5)不能处理润秒
使用JDK 7时,已经有人感觉java自带的日期类使用起来有很多弊端,所以自己写了Joda-Time这个jar包(可以通过maven导入),后来Sun公司认为Joda-Time确实不错,直接把这个jar包的API写入到JDK 8中。
PS:如果公司用的还是JDK 7,又想使用JDK 8中新的类,可以通过maven导入Joda-Time这个jar包。
2.1 LocalDate类、LocalTime类、LocalDateTime类(常用)
1. 实例化
和Calendar实例化调用getInstance()方法一样,这3个类的实例化也不是直接调用构造器,而是调用和getInstance()一样的静态方法。
(1)now()方法:当前时间实例化
(2)of()方法:自定义时间实例化
不再具有偏移性,实例化的时候就写真实的年月日。
2. 其他常用方法
(1)getXxx()获取年、月、日、时、分、秒
以LocalDateTime类的对象为例
(2)withXxx()设置 年、月、日、时、分、秒
具有不可变性!
(3)plusXxx()增加
具有不可变性!
(4)minus() 减少
和Calendar用负数不同,JDK 8的类有专门用于减的方法
2.2 Instant类
记录从1970年1月1日0时0分0秒到到现在的毫秒数。
1.实例化
(1)now()
(2)ofEpochMillis()方法
2. 其他常用方法
(1)atOffset()
(2)toEpochMilli()函数
获取从1970年到现在的毫秒数,与Date类的getTime方法一样。
2.3 DateTimeFormatter类(相当于SimpleDateFormat)
记忆点:
1. 实例化 ofPattern("")
2. 两个常用方法
①格式化format(): 日期LocalDateTime/LocalDate/LocalTime类------>字符串
②解析(格式化的逆过程)parse():字符串------>日期类
3. 不用抛异常