ZoneDateTime vs LocalDateTime
2021-09-15 本文已影响0人
程序员小白成长记
- LocalDateTime
没有包含时区信息,对象中无法保存时区信息
- ZonedDateTime
包含时区信息,不传的话会使用默认时区(ZoneId.systemDefault()),时区信息会保存到对象中
public class ZoneDateTimeLocalDateTime {
public static void main(String[] args) {
// 时间戳的概念:格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数
// 时间转为时间戳时首先需要计算到格林威治时间的毫秒数,再去除当前时区到0时区(UTC)的偏移量
LocalDateTime localDateTime = LocalDateTime.of(2021, 9, 14, 11, 13, 0, 0);
// 2021-09-14T11:13
System.out.println(localDateTime);
// 对应的时间戳转为北京时间为2021-09-14 19:13:00
// 1631617980
System.out.println(localDateTime.toEpochSecond(ZoneOffset.UTC));
// 对应的时间戳转为北京时间为2021-09-14 11:13:00
// 1631589180,会把初始化的时间当作一个8时区的时间转为时间戳
System.out.println(localDateTime.toEpochSecond(ZoneOffset.ofHours(8)));
ZonedDateTime zonedDateTime = ZonedDateTime.of(2021, 9, 14, 11, 13, 0, 0, ZoneOffset.UTC);
// 2021-09-14T11:13Z
System.out.println(zonedDateTime);
// 输出 Z:“Z”是协调世界时中0时区的标志
System.out.println(zonedDateTime.getZone());
// 对应的时间戳转为北京时间为2021-09-14 19:13:00
// 1631617980,因为ZonedDateTime本身带有时区,所以toEpochSecond()不能传入时区参数
System.out.println(zonedDateTime.toEpochSecond());
ZonedDateTime zonedDateTime_now = ZonedDateTime.now(ZoneOffset.UTC);
// 比当前北京时间少8个小时
System.out.println("zonedDateTime_now: " + zonedDateTime_now);
}
}
参考
【1】java中ZonedDateTime,LocalDateTime,Date,Calendar,Instant,timestamp的比较区别:https://blog.csdn.net/huang007guo/article/details/104019643
【2】时区相关知识扫盲:https://blog.csdn.net/nextyu/article/details/78480371