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

9 篇文章 1 订阅
4 篇文章 0 订阅

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

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

LocateDateLocateDateTime

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可以使用isBeforeisAfter来进行日期之间的比较。

上面代码运行结果为:

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提供了丰富的类别,完全满足各种需求。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值