错误消息“日期:无效的日期'2016-10-16'”


35

今天,我的时钟已自动调整为夏令时,而crontab中的脚本开始失败。我看了一下发生了什么,并显示了以下错误LC_ALL=C

日期:无效日期“ 2016-10-16”

我虽然最好只重启系统,但是现在我已经重启了,错误仍然出现:

$ date -d '2016-10-15'
Sat Oct 15 00:00:00 BRT 2016
$ date -d '2016-10-16'
date: data inválida “2016-10-16”
$ date -d '2016-10-17'
Mon Oct 17 00:00:00 BRST 2016

是什么原因造成的?


您从哪个操作系统运行此命令?无法在Debian 8上重现。尝试了两个不同locale的:sv_SE.utf8en_us.utf-8
maulinglawns

2
巴西在一天的什么时间(晚上)将时钟提前到夏令时?
techraf

我虽然在所有国家都比较晚才轮班,例如早上2点,这不太可能引起问题。
njzk2

Answers:


57

问题是夏令时已更改,并在您所在的时区于2016年10月16日转发了1小时:

$ zdump -v America/Sao_Paulo | awk '/Oct 16/ && /2016/'
America/Sao_Paulo  Sun Oct 16 02:59:59 2016 UTC = Sat Oct 15 23:59:59 2016 BRT isdst=0
America/Sao_Paulo  Sun Oct 16 03:00:00 2016 UTC = Sun Oct 16 01:00:00 2016 BRST isdst=1

因此00:0000:59从该日到该日之间的任何时间在您所在的时区均被视为无效(但在其他时区可能有效):

$ TZ=America/Sao_Paulo gdate -d '2016-10-16 0:59'
gdate: invalid date ‘2016-10-16 0:59’

$ TZ=Asia/Ho_Chi_Minh gdate -d '2016-10-16 0:59'
Sun Oct 16 00:59:00 ICT 2016

您可以设置其他时间,该时间不在该范围内:

$ TZ=America/Sao_Paulo gdate -d '2016-10-16 1:00'
Sun Oct 16 01:00:00 BRST 2016

上面是GNU日期行为。

BSD日期没有这个问题。如果输入的时间在时区中无效,它将被静默调整向前1小时,直到到达有效时间为止:

$ TZ=America/Sao_Paulo date -j -f '%Y%m%d%H%M' 201610160000
Sun Oct 16 01:00:53 BRST 2016

1小时53秒?
domen,2016年

因此,它将时间调整为距离未来53秒太远了吗?还是我误会了什么?
domen,2016年

1
啊,有道理;保留未指定的数据(与清除相反)。还是有点奇怪,因为在这种情况下,在00:59:07向前调整就足够了。
domen,2016年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.