网站首页 > java教程 正文
我们平时开发日期一般都是使用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提供了丰富的类别,完全满足各种需求。
今天的文章就写到这里了,如果对你有帮助,欢迎点赞+转发。
猜你喜欢
- 2024-09-19 带有时区的字符怎样转换为时间及Java 8中日期 与 Calendar 转换
- 2024-09-19 MySQL时间戳精度问题引发的血案(mysql时间戳用什么类型)
- 2024-09-19 一文彻底搞懂 CAS 实现原理(cas如何实现)
- 2024-09-19 java8日期处理,收藏起来,工作会用到
- 2024-09-19 java 8 新特性 日期和时间 API(java时间戳转换为日期格式)
- 2024-09-19 java8的时间和`Date`的对比(b/l date是什么时间)
- 2024-09-19 Spark Streaming 从指定时间戳开始消费 kafka 数据
- 2024-09-19 xk-time 1.1.1 发布,Java 时间工具包
- 2024-09-19 必知必会的操作Jmeter(十二)_打印时间戳
- 2024-09-19 JAVA8时间工具类转换(java时间加减)
你 发表评论:
欢迎- 最近发表
-
- class版本不兼容错误原因分析(class更新)
- 甲骨文Oracle公司为Java的最新LTS版本做出改进
- 「版本发布」Minecraft Java开发版 1.19.4-pre1 发布
- java svn版本管理工具(svn软件版本管理)
- 我的世界1.8.10钻石在第几层(我的世界1.7.2钻石在哪层)
- Java开发高手必备:在电脑上轻松切换多个JDK版本
- 2022 年 Java 开发报告:Java 8 八年不到,开发者都在用什么?
- 开发java项目,选择哪个版本的JDK比较合适?
- Java版本选型终极指南:8 vs 17 vs 21特性对决!大龄程序员踩坑总结
- POI Excel导入(poi excel导入附件)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)