前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >还在为日期计算烦恼?Java8帮你轻松搞定

还在为日期计算烦恼?Java8帮你轻松搞定

作者头像
Lvshen
发布2022-05-05 19:37:50
8180
发布2022-05-05 19:37:50
举报
文章被收录于专栏:Lvshen的技术小屋

我们平时开发日期一般都是使用Date类。在使用Date计算时,一般将会将Date转换成时间戳,即转换成ms后进行计算,这样做很麻烦。当然我们也可以使用第三方日期类。

其实Java8自带的日期类就相当的强大了,基本能满足各种计算。今天我们就来聊聊Java8里面的日期类。

LocateDateLocateDateTime

LocateDate获取的是日期,精确到天。LocateDateTime则可以精确到秒。

如上代码,运行结果为:

代码语言:javascript
复制
todayDateTime : 2021-11-02T16:13:02.638
todayDate : 2021-11-02

我们需要精确日期到秒时可以使用LocalDateTime。如果只需要精确到天,就可以使用LocalDate,比如判断两个日期是否为同一天就可以使用LocalDate

如果你的需求只需要获取时间,不需要日期。可以使用LocalTime

代码语言:javascript
复制
@Test
public void getCurrentTime() {
  LocalTime localTime = LocalTime.now();
  System.out.println("localTime :" + localTime);
}

运行结果为:

代码语言:javascript
复制
localTime :16:20:20.111

由此可见Java8后日期类更加丰富了,对日期类的处理也更加人性化了。

获取日期的年月日

Java8的LocalDate里面自带的方法可以获取到日期的年月日。

代码语言:javascript
复制
//获取年、月、日信息
@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
}

如上代码,返回的是:

代码语言:javascript
复制
Year : 2021  Month : 10  day : 29

判断两个日期是否相等

我们有时会有需求:判断两个日期是否为同一天。比如签到功能,每次签到前需要判断今天是否已经签到。如果在Java8之前我们可能会转换成时间戳,通过时间戳作比较。到了Java8后,我们直接可以使用equals()方法。

如上代码,运行结果为:

代码语言:javascript
复制
today [2021-11-03] 和 date1 [2021-11-03] 是同一天

LocalDate重写了equals方法。

代码语言:javascript
复制
@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()方法即可进行判断。

运行结果为:

代码语言:javascript
复制
生日快乐 !!

时间加减

我们经常会计算时间,比如给当前时间加两小时,减两小时等。

上面代码运行结果为:

代码语言:javascript
复制
Time after 2 hours : 16:40:30.997
newLocalDateTime after 2 hours : 2021-11-03T16:40:30.997

Java8的日期不仅可以加小时。秒,月,天,年等都可以加。

如果需要减时间,可以使用minusXXX()方法。

日期大小比较

Java8可以使用isBeforeisAfter来进行日期之间的比较。

上面代码运行结果为:

代码语言:javascript
复制
Yesterday is day before today

判断闰年

如果需要判断当前年是不是闰年,使用Java8的isLeapYear非常方便。

代码语言:javascript
复制
@Test
public void isLeapYear() {
    LocalDate today = LocalDate.now();
    if (today.isLeapYear()) {
        System.out.println("今年是闰年");
    } else {
        System.out.println("今年不是闰年");
    }
}

isLeapYear的方法如下

代码语言:javascript
复制
@Override
public boolean isLeapYear(long prolepticYear) {
    return ((prolepticYear & 3) == 0) && ((prolepticYear % 100) != 0 || (prolepticYear % 400) == 0);
}

计算两个日期之间的差

Java8可以使用Period.between可以获取两个日期之间相差的年月日。

上面代码运行结果

代码语言:javascript
复制
destLocalDate【2018-05-14】到today【2021-11-03】相差了【3】年【5】月【20】天

当然,我们可能还需要计算得更精确,比如计算相差多少天,多少秒等。这时就可以使用ChronoUnit枚举。

ChronoUnit提供了丰富的类别,完全满足各种需求。

今天的文章就写到这里了,如果对你有帮助,欢迎点赞+转发。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Lvshen的技术小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • LocateDate与LocateDateTime
  • 获取日期的年月日
  • 判断两个日期是否相等
  • 计算生日
  • 时间加减
  • 日期大小比较
  • 判断闰年
  • 计算两个日期之间的差
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档