localdate 比较两个时间_Java 8中处理日期和时间示例

本文介绍了Java 8中处理日期和时间的改进,包括使用LocalDate获取和比较日期,处理时区,计算日期差,格式化日期,以及与传统Date类的转化。通过实例展示了MonthDay和YearMonth类在生日或账单日检查中的应用,以及使用Period计算日期间隔。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:陶清清来源:https://www.jianshu.com/p/2949db9c3df5

在Java 8以前,日期和时间处理一直被广大java程序员抱怨太难用,首先是java.util和java.sql中,都包含Date类,如果要进行时间格式化,还需要java.text.DateFormat类处理。同时java.util.Date中既包含了日期,又包含了时间,所以java8新的日期和时间库,很好的解决了以前日期和时间类的很多弊端。并且也借鉴了第三方日期库joda很多的优点。

在java8中,java.time包下主要包含下面几个主要的类:

Instant:时间戳Duration:持续时间,时间差LocalDate:只包含日期,比如:2016-10-20LocalTime:只包含时间,比如:23:12:10LocalDateTime:包含日期和时间,比如:2016-10-20 23:14:21Period:时间段ZoneOffset:时区偏移量,比如:+8:00ZonedDateTime:带时区的时间Clock:时钟,比如获取目前美国纽约的时间

以及java.time.format包中的

DateTimeFormatter:时间格式化

下面我们通过例子来看如何使用java8新的日期时间库

1、获取今天的日期

LocalDate todayDate = LocalDate.now();System.out.println("今天的日期:"+todayDate);//结果今天的日期:2016-10-20

2、指定日期,进行相应操作

ec0f5e05004cd718b6d8446c038e6def.png

3、生日检查或者账单日检查

开发过程中,经常需要为过生日的用户送上一些祝福,例如,用户的生日为1990-10-12,如果今天是2016-10-12,那么今天就是用户的生日(按公历/身份证日期来算),那么通过java8新的日期库,我们该如何来进行判断?

在java8中,可以使用MonthDay,该类不包含年份信息,当然还有一个类是YearMonth

LocalDate birthday = LocalDate.of(1990, 10, 12);MonthDay birthdayMd = MonthDay.of(birthday.getMonth(), birthday.getDayOfMonth());MonthDay today = MonthDay.from(LocalDate.of(2016, 10, 12));  System.out.println(today.equals(birthdayMd));//结果true

4、获取当前的时间

日期主要是使用LocalTime,该类不包含日期,只有时间信息

14cba21ac1d9ab6c3a60acdf0f962244.png

5、日期前后比较

比较2个日期哪个在前,哪个在后,java8 LocalDate提供了2个方法,isAfter(),isBefore

LocalDate today = LocalDate.now();LocalDate specifyDate = LocalDate.of(2015, 10, 20);System.out.println(today.isAfter(specifyDate)); //true

6、处理不同时区的时间

java8中,将日期,时间,时区都很好的进行了分离。

a77070351b172650f8b5b92028849768.png

7、比较两个日期之前时间差

在项目中,经常需要比较两个日期之间相差几天,或者相隔几个月,我们可以使用java8的Period来进行处理。

LocalDate today = LocalDate.now();LocalDate specifyDate = LocalDate.of(2015, 10, 2);Period period = Period.between(specifyDate, today);System.out.println(period.getDays()); //4System.out.println(period.getMonths()); //1System.out.println(specifyDate.until(today, ChronoUnit.DAYS)); //401//输出结果41401

我们可以看到,我们使用Period类比较天数,比较奇怪,他返回的值,并不是2个日期之间总共的天数差,而是一个相对天数差,比如,5月1日,和10月2日,他比较的是仅仅2个天之间的差,那1号和2号,相差1天,而实际上,因为中间相差了好几个月,所以真正的天数差肯定不是1天,所以我们可以使用until,并指明精度单位是days,就可以计算真正的天数差了。

8、日期时间格式解析、格式化

在java8之前,我们进行时间格式化主要是使用SimpleDateFormat,而在java8中,主要是使用DateTimeFormatter,java8中,预定义了一些标准的时间格式,我们可以直接将时间转换为标准的时间格式:

String specifyDate = "20151011";DateTimeFormatter formatter = DateTimeFormatter.BASIC_ISO_DATE;LocalDate formatted = LocalDate.parse(specifyDate,formatter); System.out.println(formatted); //输出2015-10-11

当然,很多时间标准的时间格式可能也不满足我们的要求,我们需要转为自定义的时间格式

DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("YYYY MM dd");System.out.println(formatter2.format(LocalDate.now()));//结果2015 10 11

9、java8 时间类与Date类的相互转化

在转换中,我们需要注意,因为java8之前Date是包含日期和时间的,而LocalDate只包含日期,LocalTime只包含时间,所以与Date在互转中,势必会丢失日期或者时间,或者会使用起始时间。如果转LocalDateTime,那么就不存在信息误差。

5454153d1c26c799b67004e48dd71065.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值