背景
- 对于带有时区的时间,国内很多程序员实际开发场景中运用的很少,如果你的业务只是在国内,就是以北京时间为准,世界时间称为东八区时间。
- 如果你的业务是国际业务,就需要考虑时间,因为你要面对不同的国家用户使用,要转化成他们当地的时间,才能让当地的人看的懂。
时区
- 1884年,在华盛顿的国际经度会议规定:将全球按经线从东到西划分为24个时区,其中东、西各12个时区,每个时区跨越经度15°,0区和12区跨越东西各7.5°)
- 规定相邻区域的时间相差1小时(这样24个时区刚好是24小时,地球自转一周),这代表着在同一区域内的东端和西端的人看到太阳升起的时间最多相差不过1小时。
- 因为有很多国家或地区同时跨越多个时区,为了照顾到行政上的方便,常将1个国家或1个省份划在一起时区里。所以时区并不严格按南北直线来划分,而是按自然条件来划分。例如,中国幅员宽广,差不多跨5个时区,但为了使用方便简单,实际上在只用东八时区的标准时即北京时间为准。
GMT
确定时区规则后,会议还规定英国(格林尼治天文台旧址)为零时区。这就诞生了第一个世界时(Universal Time,缩写为UT):格林尼治标准时间(Greenwich Mean Time,缩写为GMT,又称格林尼治平时)。
GMT 12:00就是指格林尼治天文台当地的中午12:00,而GMT+8 12:00,则是指的东八区的北京当地时间的12:00。
UTC
1972年诞生了一个折衷方案:协调世界时(Universal Time Coordinated,缩写为UTC)1 2。UTC是当前的世界标准时间。
为了确保UTC与GMT相差不会超过0.9秒,在有需要的情况下会在UTC内加上正或负闰秒。所以,UTC与GMT基本上等同,误差不超过0.9秒。所以在实际上,UTC与GMT近乎相同。
UTC的标准格式
例如:2019-11-11T00:00:00.000Z
2019-11-11T00:00:00.000UTC
2019-11-11T00:00:00.000+08:00
由三个部分组成:
- T代表使用UTC时间
- Z是UTC偏移量,表示UTC时间与本地时的差别、即时差。
Z本身表示0时区,读作Zulu
。写作Z或不写的时候,表示不偏移、即GTM/0时区的时间。
需要偏移时,将Z替换为真实的偏移量。偏移量可用以下形式表示:±[hh]:[mm]、±[hh][mm]、±[hh]
目前有39个UTC偏移量(当伊朗试行夏令时时只有38个) 偏移量除了数字,也可以写时区名 - 时间数值。表示在限定UTC格式和偏移量的情况下,偏移时区的本地时间。
java中的
System.out.println(ZoneId.systemDefault());
DateTimeFormatter df5 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX");
//本地默认时区
System.out.println(df5.format(ZonedDateTime.now()));
//世界标准时间UTC
System.out.println(df5.format(ZonedDateTime.now(ZoneId.of("UTC"))));
//世界标准时间GMT
System.out.println(df5.format(ZonedDateTime.now(ZoneId.of("GMT"))));
//世界标准时间UT
System.out.println(df5.format(ZonedDateTime.now(ZoneId.of("UT"))));
//美国时间
System.out.println(df5.format(ZonedDateTime.now(ZoneId.ofOffset("UTC", ZoneOffset.ofHours(-5)))));
//纽约时间
System.out.println(df5.format(ZonedDateTime.now(ZoneId.of("America/New_York"))));
Asia/Shanghai 2022-07-13T15:32:28+08:00 2022-07-13T07:32:28Z
2022-07-13T07:32:28Z 2022-07-13T07:32:28Z 2022-07-13T02:32:28-05:00
2022-07-13T03:32:28-04:00
可以看到世界标准时间UTC,GMT,UT是一样的
本地时区是Asia/Shanghai,+08:00东八区