PHP 7 64 位中的触摸功能不处理超过 2038 的日期
touch function in PHP 7 64-bit does not handle dates beyond 2038
On PHP 7.2.14 64-bit, on Windows, touch()
无法将文件的日期设置为 2038 之后的日期. filemtime()
可以很好地读取此类文件的日期(日期是使用外部工具设置的)。
这是预期的行为吗?
是否可以编写以 Y2038 友好方式更改文件日期的代码?
PHP 错误跟踪中似乎没有问题:Search for "2038"
代码示例:
$filename = 'C:\Test\File.txt';
for ($i = 2035; $i <= 2040; $i++) {
$t = mktime(1,1,1,1,1,$i);
echo 'Date: '.date('D, d M Y H:i:s', $t).'<br>';
touch($filename, $t);
clearstatcache(true, $filename);
$file = filemtime ($filename);
echo 'File: '.date('D, d M Y H:i:s', $file).'<br><br>';
}
输出:
Date: Mon, 01 Jan 2035 01:01:01
File: Mon, 01 Jan 2035 01:01:01
Date: Tue, 01 Jan 2036 01:01:01
File: Tue, 01 Jan 2036 01:01:01
Date: Thu, 01 Jan 2037 01:01:01
File: Thu, 01 Jan 2037 01:01:01
Date: Fri, 01 Jan 2038 01:01:01
File: Fri, 01 Jan 2038 01:01:01
Date: Sat, 01 Jan 2039 01:01:01
File: Tue, 25 Nov 1902 18:32:45 <-- Wrong
Date: Sun, 01 Jan 2040 01:01:01
File: Wed, 25 Nov 1903 18:32:45 <-- Wrong
如果我手动将同一个文件的日期设置为 2040 年,则以下内容按预期工作:
$file = filemtime ('C:\Test\File.txt');
echo 'File: '.date('D, d M Y H:i:s', $file);
输出:
Date: Sun, 01 Jan 2040 01:01:01
看来您 运行 遇到了 2038 年问题,请看这里:https://en.wikipedia.org/wiki/Year_2038_problem
您无法在 2038 年 1 月 19 日 03:14:07 UTC 之后对时间进行编码,因此您回退到 1901 年 12 月 13 日
我在 PHP 中将其报告为错误,并在第二天修复了!
Bug #78241 is fixed starting with PHP 7.3.8 & 7.2.21.
On PHP 7.2.14 64-bit, on Windows, touch()
无法将文件的日期设置为 2038 之后的日期. filemtime()
可以很好地读取此类文件的日期(日期是使用外部工具设置的)。
这是预期的行为吗?
是否可以编写以 Y2038 友好方式更改文件日期的代码?
PHP 错误跟踪中似乎没有问题:Search for "2038"
代码示例:
$filename = 'C:\Test\File.txt';
for ($i = 2035; $i <= 2040; $i++) {
$t = mktime(1,1,1,1,1,$i);
echo 'Date: '.date('D, d M Y H:i:s', $t).'<br>';
touch($filename, $t);
clearstatcache(true, $filename);
$file = filemtime ($filename);
echo 'File: '.date('D, d M Y H:i:s', $file).'<br><br>';
}
输出:
Date: Mon, 01 Jan 2035 01:01:01
File: Mon, 01 Jan 2035 01:01:01
Date: Tue, 01 Jan 2036 01:01:01
File: Tue, 01 Jan 2036 01:01:01
Date: Thu, 01 Jan 2037 01:01:01
File: Thu, 01 Jan 2037 01:01:01
Date: Fri, 01 Jan 2038 01:01:01
File: Fri, 01 Jan 2038 01:01:01
Date: Sat, 01 Jan 2039 01:01:01
File: Tue, 25 Nov 1902 18:32:45 <-- Wrong
Date: Sun, 01 Jan 2040 01:01:01
File: Wed, 25 Nov 1903 18:32:45 <-- Wrong
如果我手动将同一个文件的日期设置为 2040 年,则以下内容按预期工作:
$file = filemtime ('C:\Test\File.txt');
echo 'File: '.date('D, d M Y H:i:s', $file);
输出:
Date: Sun, 01 Jan 2040 01:01:01
看来您 运行 遇到了 2038 年问题,请看这里:https://en.wikipedia.org/wiki/Year_2038_problem 您无法在 2038 年 1 月 19 日 03:14:07 UTC 之后对时间进行编码,因此您回退到 1901 年 12 月 13 日
我在 PHP 中将其报告为错误,并在第二天修复了!
Bug #78241 is fixed starting with PHP 7.3.8 & 7.2.21.