时区(timezone)入门 您所在的位置:网站首页 1个时区相差几度 时区(timezone)入门

时区(timezone)入门

2023-12-04 12:46| 来源: 网络整理| 查看: 265

本文主要介绍时区的概念,并列举一些例子和实际项目场景,帮助加深印象。最后为了满足好奇的同学,加了一些概念解释作为扩展阅读。

我们开始

首先我觉得最重要的一点,是需要明确两个概念。

时刻与时间

“时刻”指的是物理世界中的某一个时间点,而“时间”则是我们平常说的“几点几分”。“时刻”是一个绝对的时间点,而“时间”是时钟上显示的值,是相对的,不同地区会有时差。

例如 A 在美国,C 在中国,假如他们时差 12 小时,则某一刻如果 A 时间是 8 am,则 C 时间是 8 pm。

实际项目中,时间戳(一串数字)是一个时刻,而我们呈现给用户的(XX年XX月XX日xx时xx分xx秒)则是一个时间。这里一定要明确,不能搞混淆了。

“时刻”和“时间”要互相转换的话,还需要知道——“时区”。

时区(Timezone)

大家都知道北京是东八区,可以记作 UTC+8;而美国阿拉斯加是西九区,记作UTC-9。

UTC 是指“协调世界时”,是一个基准时间。后面跟着的“+n”可以理解为“快了n 个小时“。“-n”同理。所以北京时间比阿拉斯加快了17个小时。

一天有 24 小时,所以分为 24 个时区:西十一区到东十二区(UTC-11 到 UTC+12)。

我们首先要知道“时区”,才能把“时刻”与“时间”互相转换。

几个小例子 “日本标准时间 UTC+9” ,3:00 pm 在日本拍了照,只记录了时间戳。回到北京再看拍照时间是 2:00 pm。 假设美国是 UTC-5。如果中国和美国恰好都在 2020 年 11 月 11 日 8:00 am 宣布新冠疫苗研发成功,则中国比美国早完成13小时。 假设中国宣布改用 UTC+9,则所有时钟需要拨快 1 小时。同样是 9 am 上班,需要比之前早起 1 小时了。 足够了吗?

其实以上所说的,都没有考虑一个神奇的东西——夏令时(DST, Daylight Saving Time)。

夏令时(DST)

夏天太阳升起的早,为了鼓励大家多利用日光,某个小天才想出来这么个东西:人为规定一个叫做“夏天”的时间段,在此期间,时区加 1,时间调快 1 小时,这样人们就可以早起 1 小时了。

当然各地的夏令时起止时间并不一样。调快的小时数,也有0.5/1/1.5小时等等。

到了规定的时刻,这个调表的操作是瞬间完成的。所以进入夏令时,时钟会跳过某个时间段(调快);同时退出夏令时进入冬令时,某个时间段会出现 2 次(调慢)。这造成了时间的不连续(有断档,某些时间变得无意义),时间和时刻也不再一一对应(1 个时间可能对应 2 个时刻)。

中国在1986年 ~ 1991年实行了6年 DST。1992年至今暂停实行。

实际应用 时刻与时间

服务端往往使用时间戳(timestamp),给客户端传递某个“时间”。但前面说过,这实际上是一个“时刻”。客户端能把 timestamp 显示为某个用户可读的时间,都默认添加了“当前所在地”作为默认时区。

但是这个时区,系统设置里面是可以改的。所以有时候,不同的客户端,显示的时间差了几小时(甚至可以差 1 天,比如分别显示 4月 22 日和 4 月 23 日),不一定是 BUG,有可能只是不同客户端的时区不一样

上传当前时间(而非当前时刻)

比如我们 2020年5月4日 8 pm 拍的照片,希望不管在哪里,看到的都是这个拍照时间,而不受当地时区的影响。如何把当前时间上传给服务端呢?

按照约定好的格式,直接传字符串。例如“2020-05-04 19:00:00” 直接用字符串上传服务端,即能保持到哪都不变。

拍照时,相机往往会记录一些环境信息,称为 exif,里面的实际拍照时间就是这么显示的。

约定一个时区T,假设要上传时间A,则上传时间 A 对应时区 T 的时间戳。这样不管在哪里,忽略当地时区,始终用约定的时区 T 去算,总能算出相同的时间。

例如约定UTC+0,要上传北京时间 9 pm,则我们传 UTC+0 的 9 pm 的 时间戳(也相当于北京时间 1 pm)。客户端拿到这个时间戳,显示时间时,也要强制指定时区为 UTC+0。

如何得到这个时间戳?可以用:

当地时间戳 - 当地时区对于 UTC+0 偏移的时间戳(注意这里需要考虑 DST) 当前时间戳 -> 当前时间的可读字符串 -> 这个字符串转换为 UTC+0 时区的时间戳

当然这里只是传了时间信息,丢失了时刻信息。也可以选择同时上传两者。

扩展阅读 时区

世界各地太阳的起落时间并不一样,白天的时段也不一样,所以不能用统一的时间。想象一下,如果有A、B两地,A的太阳刚刚升起,B的已经太阳缓缓下山了,如果两地的时间都是早上 6 点,显然会很不好,会不利于生产和生活。所以我们有了“时区”的概念。

一天 24 小时,按照经度平均分为 24 份(也就是每15°划分一个区域),就可以得到 24 个时区。太阳(晨昏线)由西向东依次扫过各个时区,扫过每个时区的时间是 1 小时。所以相邻两个时区的日出(或日落)时间相差了 1 小时,时差 1 小时。

怎么表示一个时区呢?我们用格林威治天文台所在的本初子午线( 0° 经线)作为基准,称之为 GMT (Greenwich Mean Time)。其他时区按照与 GMT 的时差,分为 GMT-11(西十一区)到 GMT+12(东十二区)。

例如北京太阳起落的时刻,比 GMT 早了 8 小时,所以是东八区,记作 GMT+8。同理美国阿拉斯加比 GMT 晚 9 小时,是西九区,记作 GMT-9。

GMT 和 UTC

那么 GMT 和 UTC 有什么区别呢?先说结论:在编程领域,我们可以认为两者完全相同。GMT+8 也就是 UTC+8。

上面说的“24 小时”,是按照地球自转一圈的时间来决定的,也就是“地球时”。但是由于由于地球自转不匀速 & 自转轴偏角有变化,地球时并不是精确的,而是不断变化的。为了让时间更加精确,人们用原子的共振频率(原子钟)来精确定义“1秒”这个概念,在这个基础上的时间叫做“协调世界时”,也就是我们熟悉的 UTC(Coordinated Universal Time)。

UTC 使用的是更精确的1s,但是由于地球自转不断变慢,导致 GMT 的 1s 不断变长。UTC 通过不规则的加入闰秒来抵消地球自转变慢的影响,以保确保与 GMT 相差不超过0.9秒。

UTC 和 GMT 只是学术上有所区别。在我们的编程领域可以认为两者是一样的。

DST

目前全世界 197 个国家中,超过半数实行夏令时(近 110 个国家)。

80年代,中国工业大发展,但发电量却远远不够。于是为了省电决定实行 DST。后来有人计算,每年相当于节省了 3 个三峡大坝的发电量。

那么后来为何取消了呢?第一,虽然省电了,但调整作息导致人们效率降低了,并且可能对健康造成影响;第二,中国虽然统一采用北京时间,但实际横跨了 5 个时区。北京人民看到的太阳冉冉升起时,新疆人民可能还一片漆黑,睡的正香。所以再调快 1 小时,对于西部的同胞来说也很不友好。

ref

时间网:世界全部时区列表 www.shijian.cc/shiqu/

搜狐:中国曾施行6年的夏令时,每年省电超3个三峡,为何1991年取消了? www.sohu.com/a/386288584…

wikipedia:

时区 世界时 协调世界时 格林尼治标准时间 夏令时 原子钟


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有