java8 日期、时间操作

本文介绍了Java8中全新的日期时间API,包括Instant、ZonedDateTime、LocalDateTime等关键类的使用,以及日期时间的获取、转换、格式化、解析、比较、时间间隔和时区操作。还特别讨论了LocalDateTime在SpringBoot中的json序列化问题。

一、JDK8时间日期操作简介

Java8之前的日期和时间API,存在一些问题,最重要的就是线程安全的问题。这些问题都在Java8中的日期和时间API中得到了解决,而且Java8中的日期和时间API更加强大。java.time包中的是类是不可变且线程安全的。

新的时间及日期API位于java.time中,下面是一些关键类:

  • Instant 年月日时分秒毫秒时区,协调世界时,转成其它时间类需要本地时区
  • ZonedDateTime 这是一个包含时区的完整的日期时间
  • LocalDateTime 年月日时分秒毫秒
  • LocalDate 年月日
  • LocalTime 时分秒毫秒
  • Year 年
  • Year Month 年月
  • Month Day 月日

Java日期/时间API包含以下相应的包:

  1. java.time包:这是新的Java日期/时间API的基础包,所有的主要基础类都是这个包的一部分,如:LocalDate, LocalTime, LocalDateTime, Instant, Period,Duration等等。所有这些类都是不可变的和线程安全的,在绝大多数情况下,这些类能够有效地处理一些公共的需求。
  2. java.time.chrono包:这个包为非ISO的日历系统定义了一些泛化的API,我们可以扩展AbstractChronology类来创建自己的日历系统。
  3. java.time.format包:这个包包含能够格式化和解析日期时间对象的类,在绝大多数情况下,我们不应该直接使用它们,因为java.time包中相应的类已经提供了格式化和解析的方法。
  4. java.time.temporal包:这个包包含一些时态对象,我们可以用其找出关于日期/时间对象的某个特定日期或时间,比如说,可以找到某月的第一天或最后一天。你可以非常容易地认出这些方法,因为它们都具有“withXXX”的格式。
  5. java.time.zone包:这个包包含支持不同时区以及相关规则的类。

二、获取当前日期时间

2.1 获取当前日期时间

// 2020-03-25T13:18:51.052775200Z
System.out.println(Instant.now());
// 2020-03-25T21:18:51.064769800
System.out.println(LocalDateTime.now());
// 2020-03-25
System.out.println(LocalDate.now());
// 21:18:51.064769800
System.out.println(LocalTime.now());
// 2020
System.out.println(Year.now());
// 2020-03
System.out.println(YearMonth.now());
// --03-25
System.out.println(MonthDay.now());

2.2 获取指定日期时间

of方法使用

// 2020-03-25T21:44:32
LocalDateTime.of(2020, 3, 25, 21, 44, 32);
// 2020-03-25
LocalDate.of(2020, 3, 25);
// 21:44:32
LocalTime.of(21, 44, 32);
// 2020
Year.of(2020);
// 2020-03
YearMonth.of(2020, 3);
// --03-25
MonthDay.of(3, 25);

获取指定的日期

// 指定日期 2019-02-09
LocalDate localDate = LocalDate.of(2019, 2, 9);
// 这个月的第一天 2019-02-01
localDate.with(TemporalAdjusters.firstDayOfMonth());
// 这个月的最后一天 2019-02-28
localDate.with(TemporalAdjusters.lastDayOfMonth());
// 下个月的第一天 2019-03-01
localDate.with(TemporalAdjusters.firstDayOfNextMonth());
// 这一年的第一天 2019-01-01
localDate.with(TemporalAdjusters.firstDayOfYear());
// 这一年的最后一天 2019-12-31
localDate.with(TemporalAdjusters.lastDayOfYear());
// 下一年的第一天 2020-01-01
localDate.with(TemporalAdjusters.firstDayOfNextYear());
// 这个月的第一个星期一 2019-02-04
localDate.with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY));
// 这个月的最后一个星期一 2019-02-25
localDate.with(TemporalAdjusters.lastInMonth(DayOfWeek.MONDAY));
// 这个月的第二个星期一 2019-02-11
localDate.with(TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.MONDAY));
// 这个月的倒数第二个星期一 2019-02-18
localDate.with(TemporalAdjusters.dayOfWeekInMonth(-2, DayOfWeek.MONDAY)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值