我在 Linux 上,我正在尝试使用日期工具将一定数量的天数、小时数和分钟数添加到指定的日历日期:
例如:
$ date -d "2013-01-01 + 305 days 12 hours 30 minutes" +"%Y%m%d%0k%M%S"
20131102123000
将结果分开,以便我们更容易阅读:
2013-11-02 12:30:00
这似乎工作正常。然而,当我添加 306 天而不是 305 天时:
$ date -d "2013-01-01 + 306 days 12 hours 30 minutes" +"%Y%m%d%0k%M%S"
20131103113000
拆分:
2013-11-03 11:30:00
注意小时现在显示为 11 而不是 12!但我告诉它增加 12 小时...让我再增加一天:
$ date -d "2013-01-01 + 307 days 12 hours 30 minutes" +"%Y%m%d%0k%M%S"
20131104123000
并再次分割结果:
2013-11-04 12:30:00
现在时间又回到了我的预期。我已经使用日期版本 8.12 和 8.4 对此进行了测试,两者都出现相同的结果。我做错了什么?
我试图从 UTC 日期添加,但我没有向该工具指定这一点。这就是解决方案:
date --utc -d "2013-01-01 + 307 days 12 hours 30 minutes" +"%Y%m%d%0k%M%S"
由于UTC不遵守DST,所以小时内不会有班次。
万一其他人遇到这个障碍,这是我刚刚发现的:
TZ=Africa/Johannesburg date -d "11 Dec 2023 09:00 +4 hours" +%Y-%m-%dT%H:%M:%S+02:00
产生
2023-12-11T08:00:00+02:00
,即提前一小时而不是晚四小时。
我得到正确答案的方法是将其分为两个步骤:
d="$(TZ=Africa/Johannesburg date -d "11 Dec 2023 09:00" +%Y-%m-%dT%H:%M:%S+02:00)"
TZ=Africa/Johannesburg date -d "$d +4 hours" +%Y-%m-%dT%H:%M:%S+02:00
产生了预期的
2023-12-11T13:00:00+02:00
。