三月最后一个星期日的 touch -t 错误

三月最后一个星期日的 touch -t 错误

如果日期代码代表任何一年三月最后一个星期日的凌晨 2:00:00 到凌晨 2:59:59(我检查过 2023、2014、2016、2018),touch -t 会给我“日期格式无效”错误。核心实用程序中出现这种奇怪的现象让我大吃一惊。这是一些已知的错误吗?有解决方法吗?

例子:

$ touch -t 201603270159.59 myfile.txt #1:59AM works
$ touch -t 202303260200.00 myfile.txt #2:00AM fails
touch: invalid date format ‘202303260200.00’
$ touch -t 201603270259.59 myfile.txt #2:59AM fails
touch: invalid date format ‘201603270259.59’
$ touch -t 201603270300.00 myfile.txt #3:00AM works
$ touch -t 202303270200.00 myfile.txt #2:00AM the next day works

(这些读作 YYYYMMDDHHMM.SS)。

我接触了 5000 个文件,这些文件的时间戳随机排列,时间跨度可达 12 年前。以下是接触失败的日期时间戳列表。问题日期总是三月的最后一个星期日

touch -t 201403300248.57 fileA.txt
touch -t 201403300251.21 fileB.txt
touch -t 201403300253.03 fileC.txt
touch -t 201603270252.42 fileD.txt
touch -t 201603270234.43 fileE.txt
touch -t 201803250223.39 fileF.txt

如果我使用 touch -d,错误仍然存​​在。例如:

$ touch -d "2016-03-27 02:34:43" myfile.txt
touch: invalid date format ‘2016-03-27 02:34:43’

我在 Ubuntu 22.04.03 上。这发生在 bash、csh、sh shell 上。

答案1

在夏令时转换期间,02:00 至 02:59 的时间不存在。

Linux / Ubuntu 使用 UTC 内部跟踪时间,不遵守夏令时,并且运行良好。转换为当地时间时,02:00 和 02:59 之间会有一个空隙。

答案2

这是一个夏令时提前错误。问题源于日期戳的文件是在美国创建的,而美国的夏令时是每月的第二个星期日。然后 touch 在德国计算机上运行,​​而德国计算机上的夏令时是每月的最后一个星期日,因此会跳过 [2:00-2:59]AM。因此,美国计算机会生成德国不存在的日期时间。

相关内容