cst是哪个时区()

最近有很多读者朋友和朋友交朋友cst哪个时区有疑问。有网友整理了相关内容,希望能回答你的疑惑。关于,这个网站已经为你找到了问题的答案,希望对你有所帮助。

原创:编码日记(微信微信官方账号)ID:codelogs),欢迎分享,请保留转载来源。

简介

最近在使用date在命令中,发现东8区(中国时区)需要使用GMT-8,但在Java但需要在中间使用GMT 8,如下:

$ TZ='GMT-8' date -d@1647658144 '%F %T %:z'2022-03-19 10:49:04 08:00# 如果用GMT 8,反而慢了16个小时$ TZ='GMT 8' date -d@1647658144 '%F %T %:z'2022-03-18 18:49:04 -08:00

而在Java中,如下:

DateTimeFormatter dtf=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss XXX");String dateStr=dtf.format(Instant.ofEpochSecond(1647658144).atZone(ZoneId.of("GMT 8&);System.out.println(dateStr);//输出2022-03-19 10:49:04 08:00

这让人有点困惑,经过一段时间的搜索,发现时区表达形式上有很多知识点!

时区偏移表示法

众所周知,为了方便各地区当地时间的转换,人们将世界划分为24个时区,格林尼治天文台(GMT)零时区,东西方向有12个时区,所以自然有GMT前缀时区表示法如下:

GMT 8表示东8区,中国使用这个时区,而GMT-如果格林尼治天文台的本地时间是2022-03-190点,那么8表示西8区,GMT 8个地区的当地时间是2022-03-19点,GMT-本地时间为前8小时,即2022-03-18的16点。

请注意,虽然上述地区的当地时间表达不同,但它们实际上是同一时刻(绝对时间),以了解当地时间和绝对时间的区别。

请注意,虽然上述地区的当地时间表达不同,但它们实际上是同一时刻(绝对时间),以了解当地时间和绝对时间的区别。

GMT 8正是Java支持时区表示法,那为什么呢?Linux中却是GMT-8呢?实际上Linux中的GMT-8也可以写成Etc/GMT-8.这是它的标准名称,如下:

$ TZ='Etc/GMT-8' date -d@1647658144 -Is2022-03-19T10:49:04 08:00

DateTimeFormatter dtf=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss XXX");String dateStr=dtf.format(Instant.ofEpochSecond(1647658144).atZone(ZoneId.of("Etc/GMT-8&);System.out.println(dateStr);//输出2022-03-19 10:49:04 08:00

可以发现用Etc/GMT-8的话,Linux与Java输出是一样的,是的,Etc/GMT-8也是类似的GMT 8时区表示机制,但它 -号是反的。

Ok,虽然上述差异已经明确,但时区的表达形式尚未介绍,然后向下看…

除了GMT 除了表达方式,我们还经常看到UTC 8这种表达方式,这是UTC时区表示法。

Ok,虽然上述差异已经明确,但时区的表达形式尚未介绍,然后向下看…

除了GMT 除了表达方式,我们还经常看到UTC 8这种表达方式,这是UTC时区表示法。

即生GMT何生UTC?这是由于GMT以格林尼治天文台为时间基准,但地球不是完美的球体,自转速度较慢,因此地球自转速度不均匀,导致以格林尼治天文台为时间基准不准确。

科学家们发明了它,以便更准确地测量时间UTC时间,时间是根据锑原子的跳跃次数来衡量的GMT时间更准确,以确保GMT每隔几年GMT时间将进行调整,以便与UTC时间对齐。

因此,既然有更准确的,UTC,然后就有了以UTC例如,中国时区可以使用前缀的时区表示法UTC 8。

各时区偏移量表示法清单,如下:

GMT 8

Etc/GMT-8

UTC 8

GMT 08:00

GMT 08:00:00

GMT 0800

GMT 080000

08:00

08:00:00

0800

080000

Z

偏移表示法

描述

相对GMT多8个小时

同GMT 8, -号相反

同GMT 8

精确到分钟级

精确到秒级

精确到分钟级,省略冒号

准确到秒级,省略冒号

精确到分钟级,省略前缀

精确到秒级,省略前缀

精确到分钟级,省略前缀和冒号

准确到秒级,省略前缀和冒号

表示零时区,等同于GMT、UTC、GMT 0、UTC 0

时区区域表示法

人们除了用偏移来表示时区外,还根据区域/城市的方式来定义时区,如Asia/Shanghai,Asia/Hong_Kong都说东8区,具体有哪些城市命名的时区,可在时区数据库中查看。

此外,为了简化区域时区的表达,还定义了一套时区缩写,如CST是中国时区China Standard Time在时区缩写中可以查看各种缩写定义。

注意,一般不建议使用时区缩写,因为时区缩写的命名经常重复,比如CST是Central Standard Time(北美中部标准时间UTC -6)、China Standard Time(中国标准时间UTC 8)、Cuba Standard Time(古巴标准时间UTC -5)。

由于软件对的不同CST解释可能不同的解释,导致13或14小时的时间差异Java搭配MySQL我经常写一篇特别的文章mysql的timestamp时区问题会存在吗?由于软件对的不同CST解释可能不同的解释,导致13或14小时的时间差异Java搭配MySQL我经常写一篇特别的文章mysql的timestamp会有时区问题吗?对于必须使用时区缩写的场景,可以使用香港时区缩写HKT,它不重复,与上海处于同一时区。

Asia/Shanghai

上海时区,即东8区

CST

区域表示法

描述

时区缩写,慎用

Java中表示时区

在Java与中和时区相关的类别有TimeZone、ZoneId,其中TimeZone是老时区类,而且ZoneId是新时区类,它有ZoneOffset和ZoneRegion两个子类分别代表偏移表示和区域表示。

那么他们都支持上述时区写作呢?写个Demo验证一下,如下:

public static void main(String[]args){ printZoneId(" 08:00"); printZoneId(" 0800"); printZoneId("GMT 8"); printZoneId("Etc/GMT-8"); printZoneId("UTC 8"); printZoneId("Asia/Shanghai"); printZoneId("CST"); printZoneId("Z");}public static void printZoneId(String zone){ ZoneId zoneId; if(!ZoneId.SHORT_IDS.containsKey(zone)){ zoneId=ZoneId.of(zone); }else{ zoneId=ZoneId.of(ZoneId.SHORT_IDS.get(zone)); }TimeZone timeZone=TimeZone.getTimeZone(zone); ZoneOffset zoneOffset=zoneId.getRules().getOffset(Instant.now()); DateTimeFormatter dtf=DateTimeFormatter.ofPattern("xxx ZZZ O OOOO"); System.out.printf("%-14s -> %-28s -> class:%s -> TimeZone.offset:%d \
", zone, dtf.format(zoneOffset), zoneId.getClass().getSimpleName(), timeZone.getRawOffset());}

输出如下:

08:00 -> 08:00 0800 GMT 8 GMT 08:00 -> class:ZoneOffset -> TimeZone.offset:0 0800 -> 08:00 0800 GMT 8 GMT 08:00 -> class:ZoneOffset -> TimeZone.offset:0 GMT 8 -> 08:00 0800 GMT 8 GMT 08:00 -> class:ZoneRegion -> TimeZone.offset:28800000 Etc/GMT-8 -> 08:00 0800 GMT 8 GMT 08:00 -> class:ZoneRegion -> TimeZone.offset:28800000 UTC 8 -> 08:00 0800 GMT 8 GMT 08:00 -> class:ZoneRegion -> TimeZone.offset:0 Asia/Shanghai -> 08:00 0800 GMT 8 GMT 08:00 -> class:ZoneRegion -> TimeZone.offset:28800000 CST -> -05:00 -0500 GMT-5 GMT-05:00 -> class:ZoneRegion -> TimeZone.offset:-21600000 Z -> +00:00 +0000 GMT GMT -> class:ZoneOffset -> TimeZone.offset:0 支持

不支持

支持

不支持

支持

支持

支持

支持

支持

不支持

支持

支持

支持,代表北美西部时间,非中国标准时间

支持,代表北美西部时间,非中国标准时间

支持

时区写法

ZoneId

TimeZone

+08:00

+0800

GMT+8

Etc/GMT-8

UTC+8

Asia/Shanghai

CST

Z

支持

偏移量表示法与区域表示法区别

虽然偏移量表示法与区域表示法都可以表示时区,但由于夏令时的存在,它们并不完全等同。夏令时(Daylight Saving Time: DST),也叫 夏时制,是指为了节约能源,在天亮的早的夏季,人为将时间调快一小时,以充分利用光照资源,节约照明用电。

而中国在 1986 年至 1991 年也实行过夏令时,在1986~1991的每年从四月中旬第一个星期日的凌晨2时整(北京时间),将时钟拨快一小时,即将表针由2时拨至3时,夏令时开始;到九月中旬第一个星期日的凌晨2时整(北京夏令时),再将时钟拨回一小时,即将表针由2时拨至1时,夏令时结束。从1986年到1991年的六个年度,除1986年因是实行夏时制的第一年,从5月4日开始到9月14日结束外,其它年份均按规定的时段施行。

故会有下面看起来有点奇怪的现象:

DateTimeFormatter dtf=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss VV");Instant instant=Instant.ofEpochSecond(515527200);System.out.println(dtf.format(instant.atZone(ZoneId.of("Asia/Shanghai"))));//输出1986-05-04 03:00:00 Asia/ShanghaiSystem.out.println(dtf.format(instant.atZone(ZoneId.of("GMT+8"))));//输出1986-05-04 02:00:00 GMT+08:00

    为什么Asia/Shanghai输出为3点,而GMT+8输出为2点呢?原因是1986-05-04 02:00:00这个时间点中国正开始实行夏令时,时钟拨快了1小时。

  • 而GMT+8为什么输出为2点呢?因为中国、马来西亚、菲律宾、新加坡的时区都是GMT+8,只有中国在实行夏令时,而在GMT+8中没法感知到区域信息,那java只能以没有实行夏令时的方法来计算本地时间了。

夏令时导致的奇怪现象正是由于夏令时的存在,导致程序可能出现诡异的现象甚至bug,如下:

  • 由于夏令时会将2点改成3点,导致2点没了,所以date命令报错了

$ TZ='Asia/Shanghai' date -d 1986-05-04T02:00:00 +%sdate: invalid date ‘1986-05-04T02:00:00’$ TZ='Asia/Shanghai' date -d 1986-05-04T03:00:00 +%s515527200

  • 时间解析后再格式化输出,发现不一样了

DateTimeFormatter dtf=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss VV");ZonedDateTime time1=ZonedDateTime.parse("1986-05-04 02:00:00 Asia/Shanghai", dtf);System.out.println(time1.format(dtf));//输出1986-05-04 03:00:00 Asia/Shanghai

时间加1小时,发现加了2小时或根本没变

public static void main(String[] args) { DateTimeFormatter dtf=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss VV"); //加1小时刚好夏令时开始 ZonedDateTime time1=ZonedDateTime.parse("1986-05-04 01:00:00 Asia/Shanghai", dtf); printZonedDateTime(time1); printZonedDateTime(time1.plusHours(1)); //加1小时刚好夏令时结束 ZonedDateTime time2=ZonedDateTime.parse("1986-09-14 01:00:00 Asia/Shanghai", dtf); printZonedDateTime(time2); printZonedDateTime(time2.plusHours(1)); }private static void printZonedDateTime(ZonedDateTime time){ DateTimeFormatter dtf=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss VV"); System.out.println(time.format(dtf));}

输出如下:

1986-05-04 01:00:00 Asia/Shanghai1986-05-04 03:00:00 Asia/Shanghai //加1小时,结果看起来加了2个小时1986-09-14 01:00:00 Asia/Shanghai1986-09-14 01:00:00 Asia/Shanghai //加1小时,结果时间看起来没变

为啥会这样呢?原因是本地时间虽然看起来没变,但Asia/Shanghai这个代表的时区却发生了变化。

我们可以将上面printZonedDateTime中时间格式由yyyy-MM-dd HH:mm:ss VV修改为yyyy-MM-dd HH:mm:ss VV xxx再执行,发现输出如下:

1986-05-04 01:00:00 Asia/Shanghai +08:001986-05-04 03:00:00 Asia/Shanghai +09:001986-09-14 01:00:00 Asia/Shanghai +09:001986-09-14 01:00:00 Asia/Shanghai +08:00

如上,夏令时导致Asia/Shanghai这个时区不一定是东8区了,也可能是东9区,故Java中,想将ZoneRegion转换为ZoneOffset,需要传递一个instant时刻参数,如下://输出+08:00Instant instant=Instant.now();System.out.println(ZoneId.of("Asia/Shanghai").getRules().getOffset(instant));//输出+09:00,在1986-05-04 02:00:00 +08:00处于夏令时,增加了1小时Instant instant=Instant.ofEpochSecond(515527200);System.out.println(ZoneId.of("Asia/Shanghai").getRules().getOffset(instant));夏令时真是一种自欺欺人的做法,还好中国从1991年后就没再实行了!

主题测试文章,只做测试使用。发布者:艾迪号,转转请注明出处:https://www.cqaedi.cn/baike/39121.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年 1月 10日 下午3:28
下一篇 2023年 1月 10日 下午5:53

相关推荐

  • 十元钱的背景图是哪里(五元钱的背景图是哪里)

    5元的背面图案是泰山。 但是5元背面的泰山图案并不能算是实景图案,因为它采用了空间“蒙太奇”的手法,把“五岳独尊”的石刻和南天门、玉皇顶组合在一起,而在现实中去泰山是看不到这样的景色的,登上岱顶来到“五岳独尊”石刻处,只能看到石刻。 泰山又名岱山、岱宗、岱岳、东岳、泰岳,为五岳之首,因为气势磅礴,所以又有“天下名山第一”的美誉。 泰山位于山东省中部,其主要特…

    2023年 5月 24日
    00
  • 阴阳怪气是什么生肖(阴阳怪气是什么生肖说一下)

    阴阳怪气是什么生肖? 阴阳怪气这个词在日常用语中较为常见,通常用来形容一个人言行反复不定,让人难以琢磨其真实意图的一种状态。那么,究竟是哪个生肖容易表现出这种状态呢? 一、狡猾多变的老鼠 据传统十二生肖中的故事,老鼠为了能够排在第一位,曾经与牛合谋,最终成功登上了排名榜首的宝座。由此可见,老鼠是一个极具狡猾和阴险的生肖。他们往往善于利用别人,懂得隐藏自己的真…

    百科大全 2023年 6月 9日
    00
  • 体育四项(体育四项高考录取分数线)

    来源:邢台日报-邢台网 本报讯记者从市招生考试院获悉,根据2020年河北省普通高等学校普通体育类专业招生简章,符合条件的考生可报考体育类专业考试。考试内容有100米跑、立定三级跳远、原地推铅球、800米跑四项。 普通体育类专业包括体育教育、社会体育指导与管理等。符合2020年河北省普通高等学校招生报名条件、年龄不超过22周岁的考生均可按普通体育类报名。教练员…

    百科大全 2023年 5月 23日
    00
  • 写给老师的一封信500字6篇范文写给老师的一封信500字6篇范文怎么写

    1、写给老师的一封信500字6篇范文 亲爱的老师: 您好!我是您的学生,写这封信是想表达对您的感激之情。 在您的教导下,我学到了很多知识和技能。您用通俗易懂的方式讲解,让我更容易理解和掌握。每次上课,您总是充满激情和耐心地解答我们的问题,让我们感受到了学习的乐趣。 您不仅关心我们的学业,还关心我们的成长。您经常鼓励我们积极参与课堂讨论,提高自己的思考能力和表…

    百科大全 2023年 9月 17日
    00
  • 恐怖片第一名(世界上最恐怖的恐怖片第一名)

    最近,许多读者对恐怖电影的第一名有疑问。有网友整理了相关内容,希望能回答你的疑惑。关于世界上最恐怖的恐怖片,这个网站已经为你找到了问题的答案,希望对你有所帮助。 今天,烂番茄公布了2018年排名前十的恐怖电影,曾在中国大陆上映的电影《寂静之地》以95%的新鲜度排名第一。根据猫眼专业版,《寂静之地》在国内上映时获得2.2亿票房,猫眼得7.7分。 这部电影讲述了…

    百科大全 2023年 3月 31日
    00

站长QQ

7401002

在线咨询: QQ交谈

邮件:7401002@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信