java如何实现在多时区和夏令时中穿梭
常用时间格式
-
世界标准时间,其中T表示时分秒的开始(或者日期与时间的间隔),Z表示这是一个世界标准时间
2019-02-28T01:47:07.081Z -
本地时间,也叫不含时区信息的时间,末尾没有Z
2019-02-28T09:47:07.153 -
含有时区信息的时间,+08:00表示该时间是由世界标准时间加了8个小时得到的,[Asia/Shanghai]表示时区
2019-02-28T09:47:07.153+08:00[Asia/Shanghai]
jdk8中时间格式
表示时间的主要有4类String、Instant、LocalDateTime、ZonedDateTime。
String是格式化后的时间,Instant是时间戳,LocalDateTime是不含时区信息的时间,ZonedDateTime是含有时区信息的时间。
1. String与LocalDateTime是等价的
LocalDateTime最好的办法就是不要把它当成“本地时间”,它就是“不含时区信息的时间”。它只是存储了年月日时分秒,没有存储任何时区信息,具体表示哪里的时间全靠输入和输出时进行解释。与String完全等价,本质上是对String的解析,只是年月日时分秒格式化的存储到了对象当中,方便取用。
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.JAPAN);
LocalDateTime now = LocalDateTime.now();
System.out.println(now);
System.out.println(formatter.format(now));
System.out.println(LocalDateTime.parse("2019-02-28 11:11:11", formatter));
/*输出--》
2019-02-28T19:41:55.311
2019-02-28 19:41:55
2019-02-28T11:11:11
*/
}
2 Instant与ZonedDateTime是等价的
Instant是时间戳,是指世界标准时格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数,Instant本身实际上就指明时区了,0时区。
ZonedDateTime是含有时区信息的时间,本质上是根据时区对Instant的格式化显示。
public static void main(String[] args) {
ZonedDateTime defaultZonedTime = ZonedDateTime.ofInstant(Instant.now(), ZoneId.systemDefault());
System.out.println(defaultZonedTime);
System.out.println(defaultZonedTime.toInstant());
System.out.println(defaultZonedTime.toLocalDateTime());
ZonedDateTime australiaZonedTime &