概述
![29bf197bf0fbe4a9947968ca983113ad.png](https://i-blog.csdnimg.cn/blog_migrate/c80dead630d6ef7abafd013a785bd03e.jpeg)
属于重大变更,包含在java.time包中。
本文主要包含以下
- 现有date ,time api 的问题
- LocalDate,LocalTime和LocalDateTime
- ZonedDateTime
- · Instant
- ·Instant与LocalDateTime,LocalDate转换
现有date ,time api 的问题
- 线程安全
Date和Calendar类不是线程安全的,这使开发人员不得不处理难以调试的并发问题和编写其他代码来处理线程安全的麻烦。相反,Java 8中引入的新的日期和时间 API是不可变的,并且是线程安全的。
- API的设计和易于理解
Date和Calendar API的设计不完善,缺乏执行日常操作的方法。新的日期/时间 API以ISO为中心,并遵循一致的日期,时间,持续时间和期间域模型。有许多支持最常用操作的实用程序方法。
- 时区,时间
开发人员必须编写其他逻辑才能使用旧的API处理时区逻辑,而使用新的API,可以使用 Local和 ZonedDate / Time API完成时区的处理
LocalDate
是一个不可变的日期时间对象,表示日期,通常被视为年月日。 也可以访问其他日期字段,例如日期,星期几和星期。 例如,值"2007年10月2日"可存储在LocalDate 。
该类不存储或表示时间或时区。 相反,它是日期的描述,用于生日。 它不能代表时间线上的即时信息,而没有附加信息,如偏移或时区。
1. //of 指定时间 2. LocalDate localDate= LocalDate.of(2019,10,14); 3. //当前日期LocalDate 4. localDate = LocalDate.now(); 5. // 在当前日期上推后一天 6. LocalDate tomorrow = LocalDate.now().plusDays(1); 7. //周几: 8. DayOfWeek sunday = LocalDate.parse("2016-06-12").getDayOfWeek(); 9. //每月第几天: 10. int twelve = LocalDate.parse("2016-06-12").getDayOfMonth(); 11. //日期前后: 12. boolean notBefore = LocalDate.parse("2016-06-12").isBefore(LocalDate.parse("2016-06-11"));
LocalTime
是一个不可变的日期时间对象,代表一个时间,通常被看作是小时 - 秒。 时间表示为纳秒精度。 例如,值"13:45.30.123456789"可以存储在
1. //当前时间 2. LocalTime now = LocalTime.now(); 3. //6点30分 4. LocalTime sixThirty = LocalTime.parse("06:30");LocalTime sixThirty = LocalTime.of(6, 30); 5. //6点30分推后1小时: 6. LocalTime sevenThirty = LocalTime.parse("06:30").plus(1, ChronoUnit.HOURS); 7. //获取小时: 8. int six = LocalTime.parse("06:30").getHour(); 9. //时间先后对比: 10. boolean isbefore = LocalTime.parse("06:30").isBefore(LocalTime.parse("07:30")); 11. //一天中最大,中午,最小时间: 12. LocalTime maxTime = LocalTime.MAX;LocalTime minTime = LocalTime.MIN;LocalTime midnight = LocalTime.MIDNIGHT;
LocalDateTime
一个不可变的日期时间对象,代表日期时间,通常被视为年 - 月 - 日 - 时 - 分 - 秒。 也可以访问其他日期和时间字段,例如日期,星期几和星期。 时间表示为纳秒精度。 例如,值"2007年10月2日在13:45.30.123456789"可以存储在LocalDateTime 。
1. LocalDateTime.now(); 2. LocalDateTime.of(2015, Month.FEBRUARY, 20, 06, 30); 3. LocalDateTime localDateTime = LocalDateTime.parse("2015-02-20T06:30:00"); 4. localDateTime.plusDays(1);
ZonedDateTime
是具有时区的日期时间的不可变表示。 此类存储所有日期和时间字段,精度为纳秒,时区为区域偏移量,用于处理模糊的本地日期时间。 例如,值"2007年10月2日在13:45.30.123456789 +欧洲/巴黎时区的+02:00"可以存储在ZonedDateTime 。
1. //巴黎 2. ZoneId zoneId1 = ZoneId.of("Europe/Paris"); 3. //可以获得所有区域ID的集合 4. Set allZoneIds = ZoneId.getAvailableZoneIds(); 5. //特定区域日期时间 6. localDateTime = LocalDateTime.parse("2015-02-20T06:30:00"); 7. ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, zoneId1); 8. // result 2015-02-20T06:30+01:00[Europe/Paris] 9. //解析区域时间 10. zonedDateTime = ZonedDateTime.parse("2015-05-03T10:15:30+01:00[Europe/Paris]");
OffsetDateTime
有偏移量的日期时间的不可变表示。 该类存储所有日期和时间字段,精度为纳秒,以及与UTC /格林威治的偏移量。 例如,值"2007年10月2日13:45.30.123456789 +02:00"可存储在OffsetDateTime
1. LocalDateTime localDateTime1 = LocalDateTime.of(2015, Month.FEBRUARY, 20, 06, 30); 2. ZoneOffset offset = ZoneOffset.of("+02:00"); 3. OffsetDateTime offSetByTwo = OffsetDateTime.of(localDateTime, offset); 4. //result 2015-02-20T06:30+02:00
·Instant
在时间线上的瞬间点。
该类在时间线上建立单个瞬时点。 这可能用于在应用程序中记录事件时间戳。
实际上,这一瞬间存在一些限制。 可测量的时间线限制在long中可以持有的long 。 这大于当前估计的宇宙年龄。 该瞬间存储为纳秒分辨率。
瞬间的范围需要存储大于long 。 为了实现这一点,类存储long表示划时代秒和int表示纳秒的秒,这将始终为0和999,999,999之间。 时标是从标准的Java时代1970-01-01T00:00:00Z ,其中时代之后的时刻具有正值,较早的时刻具有负值。 对于时代第二和纳秒部分,时间线上的值越大越小
1. //当前时间戳转换 2. Instant i = Instant.ofEpochMilli(System.currentTimeMillis());
Instant与LocalDateTime,LocalDate转换
瞬时时间转换都需要先转换为ZonedDateTime,然后在进行转换。
· //instant to localDate · Instant.now().atZone(zoneId).toLocalDate(); · //instant to toLocalDateTime · Instant.now().atZone(zoneId).toLocalDateTime(); · //instant to toLocalTime · Instant.now().atZone(zoneId).toLocalTime(); · //localDate to instant · LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant();
· Duration (持续时间)
基于时间的时间量,如'34.5秒'。
该类以秒和纳秒为单位建立数量或时间量。 它可以使用其他基于持续时间的单位进行访问,例如分钟和小时。 此外, 单位可以使用,并被视为完全等于24小时,因此忽略了夏令时效应
Duration的内部实现与Instant类似,也是包含两部分:seconds表示秒,nanos表示纳秒。两者的区别是Instant用于表示一个时间戳(或者说是一个时间点),而Duration表示一个时间段,所以Duration类中不包含now()静态方法。可以通过Duration.between()方法创建Duration
1. // 2019-01-05 10:07:00 2. LocalDateTime from = LocalDateTime.of(2019, Month.JANUARY, 5, 10, 7, 0); 3. // 2019-02-05 10:07:00 4. LocalDateTime to = LocalDateTime.of(2019, Month.FEBRUARY, 5, 10, 7, 0); 5. // 表示从 2019-01-05 10:07:00 到 2019-02-05 10:07:00 这段时间 6. Duration duration = Duration.between(from, to); 7. // 这段时间的总天数 8. long days = duration.toDays(); 9. // 这段时间的小时数 10. long hours = duration.toHours(); 11. // 这段时间的分钟数 12. long minutes = duration.toMinutes(); 13. // 1天 14. Duration duration1 = Duration.ofDays(1); 15. // 1天的毫秒数 16. duration1.toMillis();
· Period(间隔)
· //两个时间 间隔 · Period period = Period.between( · LocalDate.of(2019, 1, 1), · LocalDate.of(2019, 3, 1)); · //间隔 天数 · period.getDays(); · //间隔 月数 · period.getMonths(); · //间隔年 · period.getYears();