每日一例 | 你真的了解日期时间类吗?
共 2910字,需浏览 6分钟
·
2021-05-23 16:12
前言
日期和时间是我们在日常开发中经常用到的数据类型,但是很多时候我们获取日期和时间的方式并不合理,特别是在多线程环境中会有一些问题,为了能够更合理地使用他们,我们首先要了解他们的常用方法和基本用法,今天我们就来看下如何合理地获取日期时间。
Date
date
这个类,是我们日常获取日期时间最主要的类,也是我们比较熟悉的类,常用的构造方法有很多,但绝大部分以及被弃用了:
接下来,我们就来看下这些没有被弃用的方法的常用用法。
构造方法
目前可以用的构造方法有两个,Date()
和Date(long date)
,从源码来看,第一个构造方法调用了第二个构造方法:
常用方法
getTime()
获取当前日期的毫秒时间。根据构造方法的描述,java
日期时间的起点是1970-01-01 00:00:00
,所以获取1970-01-01 00:00:00
的毫秒时间的值应该是0
,但由于它指定的时区是GMT
,也就是零时区,中国位于东八区(GMT+8
),所以在不指定时区的情况下,在中国直接获取的时间毫秒并不是0
,而是负8
小时的毫秒数,也就是-28800000
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
Date parse = dateFormat.parse("1970-01-01 00:00:00 GMT");
System.out.println(parse.getTime());
System.out.println(new Date().getTime());
输出结果:
setTime()
这个方法就是设定日期的毫秒时间。setTime(0)
,就是1970-01-01 00:00:00
。这里的时间指的就是当前时区的时间。
Date x = new Date();
x.setTime(0);
System.out.println(x);
结果:
Thu Jan 01 08:00:00 CST 1970
before()
咋感觉像是发现新大陆了呢?实话实说,以前比较实际先后顺序都是自己手动写,第一次发现官方已经提供了。
Date date1 = new Date();
Date date2 = new Date(date1.getTime() + 1);
System.out.println(date1.before(date2));
返回结果:
true
当然,你也可以自己写,也很简单,但是用现成的,它不香吗?
after()
刚好和before
相反,实现方法也就是小于改成大于。
Date date1 = new Date();
Date date2 = new Date(date1.getTime() + 1);
System.out.println(date1.after(date2));
返回结果
flase
equals
这里它重写了equals
方法,比较的是两个日期的毫秒时间
Date date1 = new Date();
Date date2 = new Date(date1.getTime() + 1);
System.out.println(date1.equals(date2));
返回结果false
compareTo
比较两个日期,如果当前日期小于传入的日期,返回-1
,如果两个日期时间相等,返回0
,否则返回1
Date date3 = new Date();
Date date4 = new Date(date1.getTime() + 5);
System.out.println(date3.compareTo(date4));
返回-1
from
这个方法是jdk1.8
引入的一个方法,它是一个静态方法,方法的作用是从Instant
对象中获取日期时间,Instant
类也是jdk1.8
引入的一个类,它是一个final
类,jdk1.8
还有一个不太为人所知的特性就是加强了对日期时间的支持。
Instant instant = Instant.now();
System.out.println(Date.from(instant));
输出结果:
Sat May 22 11:27:15 CST 2021
toInstant
这个方法同样是jdk1.8
引入的,作用和from
刚好相反。但这个方法并非静态方法。
Instant instant1 = date1.toInstant();
System.out.println(instant1);
输出结果
2021-05-22T03:30:20.977Z
Date
类到这里就结束了。
总结
鉴于时间的关系,今天我们就到这里吧。今天我们就分享了Date
类常用的一些方法和用法,确实也get
到两个我以前不知道的知识点,对,就是before
和after
,而且我也确认了不是jdk1.8
新增的方法,你学到了吗?
另外再补充下,未来一段时间,我打算继续挖掘jdk1.8
对于日期时间增强的一些知识点,发现这里的知识点还是蛮多的,这里先做一个简单的预告,未来持续更新:
format
相关的类枚举类:
DayOfWeek
、Month
其他常用的类:
Clock
、Duration
、Instant
、LocalDate
、LocalDateTime
、LocalTime
、MonthDay
、OffsetDateTime
、OffsetTime
、Period
、Ser
、Year
、YearMonth
、ZonedDateTime
、ZoneId
、ZoneOffset
、ZoneRegion
一梳理,发现涉及的内容还是蛮多的,不过没关系,我们来日方长……加油!
项目路径:
https://github.com/Syske/example-everyday
本项目会每日更新,让我们一起学习,一起进步,遇见更好的自己,加油呀
- END -