为什么`TZ=Asia/Kolkata date --date="1/1/1906"` 无效?

S.G*_*ami 27 date timezone

当我运行时:

TZ=Asia/Kolkata date --date="1/1/1906"
Run Code Online (Sandbox Code Playgroud)

我得到:

date: invalid date ‘1/1/1906’
Run Code Online (Sandbox Code Playgroud)

在这里我可以找到一篇很好的文章: 加尔各答时间

但混淆也来自于 1905 年是一个有效日期这一事实。只有 1906 年不是。任何线索为什么?

Ste*_*itt 51

根据时区数据库(参考其他来源),1906 年 1 月 1 日,加尔各答当地时间¹从偏移 5:21:10(“马德拉斯时间”)更改为偏移 5:30(印度标准时间),这意味着在 1905 年 12 月 31 日到 1906 年 1 月 1 日之间“丢失”了 8 分 50 秒。后者从 00:08:50 开始。

$ TZ=Asia/Kolkata date --date="1/1/1906 00:08:49"
date: invalid date ‘1/1/1906 00:08:49’
$ TZ=Asia/Kolkata date --date="1/1/1906 00:08:50"
Mon  1 Jan 00:08:50 IST 1906
Run Code Online (Sandbox Code Playgroud)

仅指定日期默认为 00:00:00,无效。

每当本地时间向前跳过时就会发生这种情况,例如当本地时间从“冬令时”切换到“夏令时”(或夏令时)时:

$ TZ=Europe/Paris date --date="03/29/2020 02:30"
date: invalid date ‘03/29/2020 02:30’
Run Code Online (Sandbox Code Playgroud)

¹ 出于时区数据库的目的,此处的“当地时间”定义为“铁路时间”,用于当地火车站的火车时刻表和其他铁路相关事件的时间。有关详细信息,请参阅亚洲数据库的印度部分。

时区数据库认为维基百科的“加尔各答时间”(5:53:20)一直使用到1870年,火车站改为马德拉斯时间。更令人困惑的是,时区数据库将 5:53:20 称为“Howrah Mean Time”(有一些疑问),而“Calcutta Time”的定义偏移量为 5:53:28,一直使用到六月28, 1854(再次用于铁路目的)。

  • 可能值得注意的是,这是一种极为常见的情况,许多国家每年更改两次偏移量(所谓的“夏令时”),但经常仔细选择转换的日期和时间,以便“错过”时间遇到的可能性比较小。 (7认同)
  • 他们说,在你的代码中使用时区。他们说,这会很有趣。 (5认同)