ZonedDatetime = LocalDateTime + ZoneId
ZonedDateTime:带时区的日期和时间
ZoneId:新的API定义的时区对象(取代几句的java.util.TimeZone)
Instant:时刻对象(epoch seconds)
1.ZonedDateTime对象为携带时区的日期时间
- now()
- getZone()
public static void main(String[] args) {
ZonedDateTime zbj = ZonedDateTime.now();
System.out.println("当前时区的日期和时间: "+zbj);
ZonedDateTime zny = ZonedDateTime.now(ZoneId.of("America/New_York"));
System.out.println("纽约时区的当前时间和日期: "+zny);
}
![](https://img2018.cnblogs.com/blog/1418970/201904/1418970-20190412110536308-1119119925.png)
![](https://img2018.cnblogs.com/blog/1418970/201904/1418970-20190411220759564-460638845.png)
![](https://img2018.cnblogs.com/blog/1418970/201904/1418970-20190411221514272-2077653383.png)
![](https://img2018.cnblogs.com/blog/1418970/201904/1418970-20190412092619408-817976753.png)
![](https://img2018.cnblogs.com/blog/1418970/201904/1418970-20190412214051931-719259761.png)
//ZonedDateTime <-> Instant
Instant ins1 = zdt.toInstant();
ZonedDateTime zdt1 = ins1.atZone(ZoneId.systemDefault());
//Instant <-> long
long l1 = ins1.toEpochMilli();
Instant ins2 = Instant.ofEpochMilli(l1);
//long <-> ZonedDateTime
long l2 = ZonedDateTime.now().toEpochSecond();
ZonedDateTime zdt2 = Instant.ofEpochMilli(l2).atZone(ZoneId.systemDefault());
System.out.println(zdt1+" "+ins1+" "+l1+"毫秒");
System.out.println(zdt2+" "+ins2+" "+l2+"秒");
}
<img src="https://img2018.cnblogs.com/blog/1418970/201904/1418970-20190412195835705-242422631.png" width="500" />
## 6.TemporalAmount
表示一段时间:1天/2小时/30分钟,有两个子类:
* Duration:Days Hours Minutes Seconds Mills Nanos
* Peroid:Day Month Week Year
可以加减一个TemporalAmount对象
* plus(TemporalAmount)
* minus(TemporalAmount)
```#java
public static void main(String[] args) {
Period towDays = Period.ofDays(2);
Duration oneHour = Duration.ofHours(1);
Duration fiveMin = Duration.ofMinutes(5);
ZonedDateTime zdt = ZonedDateTime.now().minus(towDays).plus(oneHour).plus(fiveMin);
System.out.println(ZonedDateTime.now());
System.out.println(zdt);
}
![](https://img2018.cnblogs.com/blog/1418970/201904/1418970-20190412095551765-428099398.png)
7.java.time提供的其他Class
- ZoneOffset
- OffsetDateTime
- OffsetTime
- ChronoLocalDate/ChronoLocalDateTime:用于实现其他历法
8.总结:
- ZonedDateTime就是LocalDateTime关联ZoneId
- ZonedDateTime可以做时区转换,注意不要自己试图通过加减时区偏移量计算。因为时区的转换不仅设计到夏令时,还包括历史夏令时的改动。
- ZoneId表示时区
- Instant表示时刻(内部用long表示epoch second)
- ZonedDateTime、Instant、Long可以相互转换