我们平时开发日期一般都是使用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
提供了丰富的类别,完全满足各种需求。
今天的文章就写到这里了,如果对你有帮助,欢迎点赞+转发。