2024 年 3 月 30 日之后怎么可能有 1 日呢?

2024 年 3 月 30 日之后怎么可能有 1 日呢?

我在欧盟区 +1 或当夏令时已开启,+2。现在是 2024 年 3 月 31 日星期日。这周日早上,我们改为夏令时,2→3(英语四级考试中欧夏令时)。

我的 Linux 服务器位于不同的网络中,在每月最后一天的 23:58 报告每月的能源消耗情况。它们多年来一直完美工作。网络间的旅行间隔长达 8 小时!

每个服务器都有一个实时时钟和同步NTP经常。如果有任何可疑的情况,有很多保障措施,每个网络中的三台核心服务器不断相互检查一切(包括时间)是否正常。是的,我很偏执。我不允许 (0) 个错误。我的系统可以完美稳定地运行很多年。工作了,抱歉。

昨晚,3 月 30 日 23:58,我所有的 Raspberry Pi 服务器决定 3 月 30 日之后是下个月 1 日!我验证了每个网络的 7(七)种不同且独立的方式,一切确实发生在 3 月 30 日 23:58 分钟内!确认包括 9 个忽略 DST 的独立设备,以及一个外部美国和欧盟邮件提供商。

每天 23:58,我的服务器都会进行一次 bash 测试,但该测试显然可能在很多方面出错:

(( $(date -d tomorrow +"%-d") == 1 )) && ZadnjiDanMjeseca=1 || ZadnjiDanMjeseca=""

我看不出这个测试有任何出错的地方!我希望我错了。此时此刻,2024 年 3 月 31 日。一切都工作得很好,zdump 是正确的! (以下示例对我来说似乎格式错误。必须显示四个不同的行。)

hwclock; date; date -d tomorrow +"%-d"
2024-03-31 19:22:23.311664+02:00
ned, 31.03.2024.  19:22:23 CEST
1

我可以解释这个问题的唯一方法是:我使用的Linux发行版,树莓派,不知何故有两个独立的内核函数计算时间。可悲的是,其中一个人错过了这一事实:今年是闰年! UPS!

但是,如果是这样,为什么要限制为这个 Raspberry Pi 操作系统版本和内核呢?天哪,微软没能让Excel正确计算闰年!

这个周末,我看到我国的几家机构(银行、我们的国家税务局……)都出现了与日期相关的问题,并且也关闭了商店,所以这似乎不仅限于 Raspbian。

这对我作为程序员来说是不利的,但是,我找不到其他解释。希望我错了......

在发帖之前,我从 1 日的 23:58 切换到 00:03,并且我必须在该月最后一天的 23:58 记录数据,我通过添加 300 秒进行测试,而不是要求 +1天。这些解决方案应该有效。

所以它没有被隐藏在评论中:由于我从来没有使用过这样的计算,所以我犯了一个基本错误,期望“明天”实际上意味着明天!这对我来说没有任何意义;这意味着+1天。因此,我预计这两个命令会产生相同的输出:

> date -d 'next tue'
uto,  2.04.2024.  00:00:00 CEST

> date -d 'tomorrow'
uto,  2.04.2024.  10:24:55 CEST

而不必输入:

date -d "tomorrow 0"

答案1

好吧,我得到:

# date -s '2024-03-30 23:58'; date -d tomorrow
Sat Mar 30 23:58:00 EET 2024
Mon Apr  1 00:58:00 EEST 2024

这并不奇怪,因为 2024-03-30 23:58 之后 24 小时后2024-04-01 00:58。只是后者是在夏令时。

手册说:

相关项目向前或向后调整日期(如果没有,则调整当前日期)。相关项目的影响会累积。
[...]
更精确的单位是[...],“天”相当于24小时,
[...]
字符串“明天”相当于未来的一天(相当于“天”),
[.. .]
当相关项目导致生成的日期跨越时钟调整的边界(通常是夏令时)时,生成的日期和时间会相应调整。

避免此类问题的方法是请求一个不接近午夜的时间。

例如,中午通常是在正确的一天:

# date -s '2024-03-30 23:58'; date -d '+12 hours'
Sat Mar 30 23:58:00 EET 2024
Sun Mar 31 12:58:00 EEST 2024 

这似乎也有效:

# date -s '2024-03-30 23:58'; date -d '12:00 tomorrow'
Sat Mar 30 23:58:00 EET 2024
Sun Mar 31 12:00:00 EEST 2024

相关内容