我们平时开发日期一般都是使用Date
类。在使用Date
计算时,一般将会将Date
转换成时间戳,即转换成ms
后进行计算,这样做很麻烦。当然我们也可以使用第三方日期类。
其实Java8自带的日期类就相当的强大了,基本能满足各种计算。今天我们就来聊聊Java8里面的日期类。
LocateDate
与LocateDateTime
LocateDate
获取的是日期,精确到天。LocateDateTime
则可以精确到秒。
如上代码,运行结果为:
- todayDateTime : 2021-11-02T16:13:02.638
- todayDate : 2021-11-02
我们需要精确日期到秒时可以使用LocalDateTime
。如果只需要精确到天,就可以使用LocalDate
,比如判断两个日期是否为同一天就可以使用LocalDate
。
如果你的需求只需要获取时间,不需要日期。可以使用LocalTime
。
- @Test
- public void getCurrentTime() {
- LocalTime localTime = LocalTime.now();
- System.out.println("localTime :" + localTime);
- }
运行结果为:
localTime :16:20:20.111
由此可见Java8后日期类更加丰富了,对日期类的处理也更加人性化了。
Java8的LocalDate
里面自带的方法可以获取到日期的年月日。
- //获取年、月、日信息
- @Test
- public void getDetailDate() {
- LocalDate today = LocalDate.now();
- int year = today.getYear();
- int month = today.getMonthValue();
- int day = today.getDayOfMonth();
-
- Console.log("Year : {} Month : {} day : {}", year, month, day);
- //Year : 2021 Month : 10 day : 29
- }
如上代码,返回的是:
Year : 2021 Month : 10 day : 29
我们有时会有需求:判断两个日期是否为同一天。比如签到功能,每次签到前需要判断今天是否已经签到。如果在Java8之前我们可能会转换成时间戳,通过时间戳作比较。到了Java8后,我们直接可以使用equals()
方法。
如上代码,运行结果为:
today [2021-11-03] 和 date1 [2021-11-03] 是同一天
LocalDate
重写了equals
方法。
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj instanceof LocalDate) {
- return compareTo0((LocalDate) obj) == 0;
- }
- return false;
- }
-
- int compareTo0(LocalDate otherDate) {
- int cmp = (year - otherDate.year);
- if (cmp == 0) {
- cmp = (month - otherDate.month);
- if (cmp == 0) {
- cmp = (day - otherDate.day);
- }
- }
- return cmp;
- }
从重写的equals源码来看,是将两个日期的年月日依次作比较。
如果我们知道用户的出生日期,我们要判断今天是不是用户的生日。我们就可以使用MonthDay
这个类。
如上代码,通过MonthDay
可以获取到月和日,然后直接使用equals()
方法即可进行判断。
运行结果为:
生日快乐 !!
我们经常会计算时间,比如给当前时间加两小时,减两小时等。
上面代码运行结果为:
- Time after 2 hours : 16:40:30.997
- newLocalDateTime after 2 hours : 2021-11-03T16:40:30.997
Java8的日期不仅可以加小时。秒,月,天,年等都可以加。
如果需要减时间,可以使用minusXXX()
方法。
Java8可以使用isBefore
和isAfter
来进行日期之间的比较。
上面代码运行结果为:
Yesterday is day before today
如果需要判断当前年是不是闰年,使用Java8的isLeapYear
非常方便。
- @Test
- public void isLeapYear() {
- LocalDate today = LocalDate.now();
- if (today.isLeapYear()) {
- System.out.println("今年是闰年");
- } else {
- System.out.println("今年不是闰年");
- }
- }
isLeapYear
的方法如下
- @Override
- public boolean isLeapYear(long prolepticYear) {
- return ((prolepticYear & 3) == 0) && ((prolepticYear % 100) != 0 || (prolepticYear % 400) == 0);
- }
Java8可以使用Period.between
可以获取两个日期之间相差的年月日。
上面代码运行结果
destLocalDate【2018-05-14】到today【2021-11-03】相差了【3】年【5】月【20】天
当然,我们可能还需要计算得更精确,比如计算相差多少天,多少秒等。这时就可以使用ChronoUnit
枚举。
ChronoUnit
提供了丰富的类别,完全满足各种需求。
今天的文章就写到这里了,如果对你有帮助,欢迎点赞+转发。