【译文】程序员对时区的误解

我姑姑遇到一个问题

她喜欢参加 Zoom 会议,但会议都在不同的时区举行。她很难记住应该加 4 个小时,还是减 3 个小时。她不是最懂技术的人,所以不能用谷歌。她只能寻求帮助。

每次。

而且,对于技术水平不高的人来说,这还容易出错。

这引起了我的思考:

如果活动组织者可以分享一个链接,帮你完成这项工作,会怎么样呢?如果有人点击 mytime.at/5pm/EST,他们就会看到当地版本的时间。这听起来很简单。

我开始编码。

图0:【译文】程序员对时区的误解

后来,我发现 mytime.io 已经实现了一个非常类似的功能,而且遇到了同样的陷阱

我知道试图管理时间是一件愚蠢的事,但这正是日期时间库的用途。我只想在上面多建一个时区转换层。

当然,这并不复杂

…不对?

我很快就发现自己错得有多离谱。我接二连三地发现了一个又一个看似明显正确的 “事实 “的谬误。最终,我最初的设想变得不可能实现,除非做出严重的妥协(关于这一点,我将在以后的博文中详述)。

希望这份清单能帮你避开我踩过的地雷。以下所有谬误都是我成年后曾经认为是真的。

其中大部分我一个月前还信以为真。

误解 1:UTC 偏移从 -12 到 +12

原来,UTC 偏移的范围是从 -12 到 +14。是的,+14。这样,UTC 就可以偏移 27 个小时(不要忘了零点偏移)

它是如何工作的?UTC-12 的时间与 UTC+12 相同,但比 UTC+12 晚一天。UTC-11和UTC+13也是一样,等等。

为什么会有这么大的范围?这是因为太平洋岛国的居民决定,他们希望位于国际日期变更线的某一边。

这使得国际日期变更线非常参差不齐

图1:【译文】程序员对时区的误解

误解 2:每个UTC偏移正好对应一个时区

这里有 10 个不同的时区,它们都位于 UTC+5:

  • 阿克托比时间
  • 毛森时间
  • 马尔代夫时间
  • Oral 时间
  • 巴基斯坦标准时间
  • 法国南方和南极时间
  • 塔吉克斯坦时间
  • 土库曼斯坦时间
  • 乌兹别克斯坦时间
  • 叶卡捷琳堡时间

你可能会问:既然它们都在同一个UTC偏移量上,为什么这些国家不能使用同一个时区呢?也许巴基斯坦人并不热衷于使用 “叶卡捷琳堡时间”。

误解 3:世界上的国家比时区还多

这怎么可能是错的呢?嗯…

  • 许多国家都想拥有自己的时区(你认为有多少国家使用缅甸时间?)
  • 有些国家把自己分成多个时区(如东部时间和西部时间)
  • 仅军事时间就使用了 25 个时区,从 UTC-12 到 UTC+12 每小时一个时区
  • 夏令时。下文将详细介绍

全世界 195 个国家共使用 244 个时区

误解 4:每个时区都有一个约定俗成的名称

有没有注意到每个时区都只有英语单词?西班牙语和法语国家慷慨地使用我们的语言,真是太好了,不是吗?

是的,没错。

东部标准时间(Eastern Standard Time)、东部标准时间(Tiempo del Este)和东部标准时间(Heure Normale de l’Est)都是完全相同的时区的不同名称。

祝你在你的图书馆里编码编码得开心。

误解 5:时区总是与UTC 相差整数个小时

印度标准时间与协调世界时相差五个半小时。还有很多例子

误解 6:好吧,时区总是与UTC 相差整数个半小时

尼泊尔喜欢UTC偏移45分钟。

为什么多出的 15 分钟对他们如此重要?因为他们非常希望自己的山在正午时能看到正上方的太阳。

但这让人不禁要问:如果山峰移动了,会发生什么呢?

图2:【译文】程序员对时区的误解

误解 7:一个国家全年都保持相同的UTC偏移量

别忘了夏令时!欧洲人称之为 “夏令时”。

实行夏令时的国家每年会改变两次UTC偏移量。

误解 8:有标准的时区声明格式

哈,我倒希望如此。以下是我发现的一些标准,可能还有更多:

通用名称

这些是我们习惯使用的传统时区名称。例如:太平洋标准时间:太平洋标准时间。

但我不知道这些名称是否有正式的说法,它们就是那么不标准。

IANA 区域值

这是最接近官方标准的名称。它根本不是官方标准,但却是开发者社区一致支持的标准。

它是一个经过精心维护的数据库,其中包含所有已知的时区数据,代表了全球各地当地时间的整个历史。 不过,它并没有给任何时区命名,而是使用其中最著名的城市名称,这就导致了以下情况:

基于知名城市

这个 “基本上是源自 IANA 时区值的糟糕用户界面”。

全时区名称会带来命名上的复杂性,这一点我们已在上文讨论过。如果这还不够有趣,那么承认某些时区(如以色列标准时间)还会带来政治影响。

一些开发者采取了更安全的方法,只用其中某个著名城市的名称来标识时区,而懒得将其映射到普通名称上。这就是为什么 Ubuntu 时区选择器会让你选择 “纽约 “而不是东部标准时间。

图3:【译文】程序员对时区的误解

遗忘时区,使用原始 UTC 偏移量

W3 的国际标准放弃了时区的概念,宣布工程师只应存储时间戳的原始 UTC 偏移量。

GPS 坐标

有趣的事实:许多获取地区 UTC 偏移量的应用程序接口只需要 UTC 时间和经纬度坐标。这让他们可以明确定义任何时刻,而不必担心夏令时的问题。

如果你稍微眯一下眼睛,你就会发现这是第四个标准。

误解 9:夏令时间每年都在同一时间开始

你以为这会是世界大国达成共识的一件事吗?每个国家都会选择自己的夏令时开始时间

误解 10:一个国家的时区永远不会改变

几乎每年都会有国家通过法律来修改自己的时区。

有一个令人印象深刻的例子:几年前,萨摩亚群岛希望与澳大利亚的贸易伙伴一样,在国际日期变更线的另一端过周末。因此,在 12 月 29 日午夜,他们将自己的 UTC 偏移量从 -11 改为 +13,跳过了 12 月 30 日,直接进入 12 月 31 日。

这一年,萨摩亚公民少了一天可以庆祝节日。

好的一面是,仅 40 英里之外的美属萨摩亚群岛留在了国际日期变更线的另一端。现在,萨摩亚人可以在西岛庆祝新年,然后在第二天晚上乘船前往美属萨摩亚参加第二个新年派对。

图4:【译文】程序员对时区的误解

误解 #11:一个国家在夏令时期间保持在同一时区

关于夏令时的有趣之处在于,它实际上并没有改变时区的UTC偏移量。 相反,夏令时国家会切换到不同的时区,并使用不同的名称。

例如

德克萨斯州从中央标准时间改为中央夏令时间。

智利从智利标准时间改为智利夏令时间

图5:【译文】程序员对时区的误解

误解 12:夏令时从三月左右开始,十月左右结束

南半球的夏季在一年的另一半时间。模式是翻转的。

误解 13:每个时区都有自己的名字

哪个国家应该使用 “东部标准时间”?

北美因为发明了这个名字而拥有优先权,但你认为没有人反对吗?澳大利亚认为这听起来是个不错的名字,因此,尽管世界上其他国家都把他们的时区称为澳大利亚东部标准时间,但澳大利亚的一些公民还是把它称为 “东部标准时间”(但并不是所有人都这么叫)。

误解 14:每个时区都有自己的缩写

当有人说 CST 时,指的是哪个时区?

  • 中央标准时间
  • 中国标准时间
  • 古巴标准时间

还记得夏令时期间时区名称是如何变化的吗?很多人不知道这一点,在夏令时期间一直使用错误的缩写。中部夏令时可能使用 CST。

如果时区没有标准名称,你还能指望缩写也有标准名称吗?

误解 15:从一个时区转换到另一个时区总是毫不含糊的

如果我说我想把下午 5 点的东部标准时间转换成巴基斯坦标准时间,我说的是美国东部标准时间还是澳大利亚东部标准时间?

夏令时是否有效?

好吧,这很棘手。但是,如果我们把日期和确切的城市包括进去,就能可靠地进行转换了,对吗?

如果日期和时间是 2020 年 11 月 1 日凌晨 1:30,正好是美国夏令时结束、时钟向后移动的时间呢?

当天凌晨 1:30 会出现两次,你怎么知道哪一次是有意为之?

图6:【译文】程序员对时区的误解

误解 16:您的时区库可以识别任何时区(您正在使用时区库,对吗?)

还记得所有这些不同的潜在时区名称和格式吗?大多数时区库只支持一种。

而且它们可能会受到本地计算机上安装的时区的限制。

是的,真的。

请记住,如果时区可以根据当地政府的一时兴起而改变,那么图书馆就需要一些外部数据集作为计算基础。这个外部数据集可能就是你电脑上安装的时区。

误解 #17:整个国家总是在夏令时期间转换时区

在美国,亚利桑那州不实行夏令时

误解 18:整个亚利桑那州总是在夏令时期间转换时间

在亚利桑那州,纳瓦霍部落很乐意遵守夏令时。

误解 #19:除夏令时外,一个州内的每个城市都遵循相同的时区

在美国印第安纳州,大多数城市采用东部标准时间,但也有少数城市决定采用中部标准时间

误解 20:每个城市都位于同一时区内

在历史上,有几次州界或时区的划分并没有考虑到谁是真正的边界居民,从而将一个城市一分为二。 这样的例子多得令人吃惊。

这使得一些非常不寻常的睡眠时间成为可能

这也是在确定时区时,GPS 坐标比城市名称更可靠的原因。

误解 #21:世界上每个地方都有指定的时区

南北两极没有官方时区。那里的研究人员只遵循自己国家的时间。

这不可能造成混乱。

误解 22:这是一份全面的误解清单

以上是我目前发现的误解,但我相信还有更多的误解等着我们去发现。哎呀,直到我发布这份清单的 10 个小时前,我才意识到UTC 偏移量一直高达 +14!

误解 #23:Reddit读者们会同意这些都是误解

我在跟谁开玩笑?Reddit读者们从不会就任何事情达成一致。不过说真的,这篇文章引发了一场对话,凸显了我的一些误解。谢谢 Reddit!

部分精彩内容:

  • 误解#24:夏令时每年正好开始和停止一次:当斋月开始时,一些穆斯林国家会退出夏令时,然后在斋月结束后重新进入夏令时。 这让日落(结束斋戒的时间)来得更快(via matthieum)
  • 误解#25:夏令时的偏差总是正好一小时:豪勋爵岛使用 30 分钟的夏令时偏移(通过 paulrpg),而英格兰曾经使用过 2 小时的夏令时偏移(通过 bandwidthcrisis)
  • 误解#26:标准时间与时区相同:它们是不同的概念(显然我在整篇文章中都用错了:P)(via lpsmith)
  • 误解#27:时区总是与UTC相差整数个刻钟:阿姆斯特丹曾经是UTC+19分32.13秒。世界上大多数国家都将其简化为UTC+0:20(via DJDavio)
  • 误解#28: 每个人都遵循自己的官方时区:中国西部一些地区有自己的非官方时区(via jl2352),一些行业自主决定忽略夏令时,以缓解疯狂的时区现象(via bitchkat)
  • 误解#29:将时间保存为 UTC 可以解决你的问题:以UTC保存未来的时间戳仍然会导致混乱(via AryA_ch)
  • 误解#30:从出生日期可以看出谁更年长: 不一定 (via oshkarr)
  • 误解#31:世界上正好有 195 个国家:不完全是时区,而是另一种误解(via kankyo)
  • 误解#32:如果你有UTC时间戳和GPS坐标,你总能确定当地时间:巴勒斯坦和以色列的时区不同。因此,在约旦河西岸,时区取决于你是巴勒斯坦人还是以色列定居者。如果你不知道你是在为哪个人计算时区,那么当地时间就是模糊的(通过 haxney)
  • 误解#33:一个地区的历史UTC偏移从未改变:自 2011 年 7 月以来,1927 年上海的时区偏移至少调整了两次(via JoeIngeno)
  • 误解#34:夏令时是唯一的时区调整:有时,一些国家会在冬季将时钟向后调,并称之为冬令时(via Radek Zajic)

本文文字及图片出自 Falsehoods programmers believe about time zones

余下全文(1/3)
分享这篇文章:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注