ZonedDateTime
392字约1分钟
2024-08-10
LocalDateTime
总是表示本地日期和时间,要表示一个带时区的日期和时间,我们就需要 ZonedDateTime
可以简单地把 ZonedDateTime
理解成 LocalDateTime
加 ZoneId
。ZoneId
是 java.time
引入的新的时区类,注意和旧的 java.util.TimeZone
区别
创建ZonedDateTime
对象
public static void main(String[] args) {
// 通过 now 方法返回当前时间(时区不同,但表示是同一时刻)
ZonedDateTime zdt1 = ZonedDateTime.now(); // 默认时区
ZonedDateTime zdt2 = ZonedDateTime.now(ZoneId.of("America/New_York")); // 指定时区获取当前时间
System.out.println(zdt1); // 2021-02-28T17:57:34.209+08:00[Asia/Shanghai]
System.out.println(zdt2); // 2021-02-28T04:57:34.214-05:00[America/New_York]
// 通过给 LocalDateTime 附加一个 ZoneId 变成 ZonedDateTime(日期相同,附加时区不同,是两个不同的时刻)
LocalDateTime ldt = LocalDateTime.of(2021, 02, 28, 17, 59, 55);
ZonedDateTime zdt3 = ldt.atZone(ZoneId.systemDefault());
ZonedDateTime zdt4 = ldt.atZone(ZoneId.of("America/New_York"));
System.out.println(zdt3); // 2021-02-28T17:59:55+08:00[Asia/Shanghai]
System.out.println(zdt4); // 2021-02-28T17:59:55-05:00[America/New_York]
}
时区转换
要转换时区,首先我们需要有一个 ZonedDateTime
对象,然后,通过 withZoneSameInstant()
将关联时区转换到另一个时区,转换后日期和时间都会相应调整
将北京时间转换为纽约时间
public static void main(String[] args) {
// 以中国时区获取当前时间
ZonedDateTime zbj = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
// 转换为纽约时间
ZonedDateTime zny = zbj.withZoneSameInstant(ZoneId.of("America/New_York"));
System.out.println(zbj); // 2021-02-28T18:05:59.117+08:00[Asia/Shanghai]
System.out.println(zny); // 2021-02-28T05:05:59.117-05:00[America/New_York]
}
有了 ZonedDateTime
,将其转换为本地时间就非常简单
ZonedDateTime zdt = ...
LocalDateTime ldt = zdt.toLocalDateTime();
转为本地时间 LocalDateTime
会直接丢弃时区信息