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


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

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

    LocateDateLocateDateTime

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

    如上代码,运行结果为:

    1. todayDateTime : 2021-11-02T16:13:02.638
    2. todayDate : 2021-11-02

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

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

    1. @Test
    2. public void getCurrentTime() {
    3.   LocalTime localTime = LocalTime.now();
    4.   System.out.println("localTime :" + localTime);
    5. }

    运行结果为:

    localTime :16:20:20.111
    

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

    获取日期的年月日

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

    1. //获取年、月、日信息
    2. @Test
    3. public void getDetailDate() {
    4.     LocalDate today = LocalDate.now();
    5.     int year = today.getYear();
    6.     int month = today.getMonthValue();
    7.     int day = today.getDayOfMonth();
    8.     Console.log("Year : {}  Month : {}  day : {}", year, month, day);
    9.     //Year : 2021  Month : 10  day : 29
    10. }

    如上代码,返回的是:

    Year : 2021  Month : 10  day : 29
    

    判断两个日期是否相等

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

    如上代码,运行结果为:

    today [2021-11-03] 和 date1 [2021-11-03] 是同一天
    

    LocalDate重写了equals方法。

    1. @Override
    2. public boolean equals(Object obj) {
    3.     if (this == obj) {
    4.         return true;
    5.     }
    6.     if (obj instanceof LocalDate) {
    7.         return compareTo0((LocalDate) obj) == 0;
    8.     }
    9.     return false;
    10. }
    11. int compareTo0(LocalDate otherDate) {
    12.     int cmp = (year - otherDate.year);
    13.     if (cmp == 0) {
    14.         cmp = (month - otherDate.month);
    15.         if (cmp == 0) {
    16.          cmp = (day - otherDate.day);
    17.         }
    18.     }
    19.     return cmp;
    20. }

    从重写的equals源码来看,是将两个日期的年月日依次作比较。

    计算生日

    如果我们知道用户的出生日期,我们要判断今天是不是用户的生日。我们就可以使用MonthDay这个类。

    如上代码,通过MonthDay可以获取到月和日,然后直接使用equals()方法即可进行判断。

    运行结果为:

    生日快乐 !!
    

    时间加减

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

    上面代码运行结果为:

    1. Time after 2 hours : 16:40:30.997
    2. newLocalDateTime after 2 hours : 2021-11-03T16:40:30.997

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

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

    日期大小比较

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

    上面代码运行结果为:

    Yesterday is day before today
    

    判断闰年

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

    1. @Test
    2. public void isLeapYear() {
    3.     LocalDate today = LocalDate.now();
    4.     if (today.isLeapYear()) {
    5.         System.out.println("今年是闰年");
    6.     } else {
    7.         System.out.println("今年不是闰年");
    8.     }
    9. }

    isLeapYear的方法如下

    1. @Override
    2. public boolean isLeapYear(long prolepticYear) {
    3.     return ((prolepticYear & 3== 0&& ((prolepticYear % 100) != 0 || (prolepticYear % 400== 0);
    4. }

    计算两个日期之间的差

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

    上面代码运行结果

    destLocalDate【2018-05-14】到today【2021-11-03】相差了【3】年【5】月【20】天
    

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

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

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

  • 相关阅读:
    mtk sensor 驱动调试
    【SpringBoot】MVC配置解决跨域但仍然存在跨域
    向已有项目添加LICENSE
    vue项目中使用vant轮播图组件(桌面端)
    C语言从头学16——数据类型(二)
    Win7安装Python + PyCharm
    如何写好项目管理应聘简历?
    LeetCode 42.接雨水
    Java基础:Collection、泛型
    行为设计模式之职责链模式
  • 原文地址:https://blog.csdn.net/wujialv/article/details/126437182