PHP 7 64位中的touch函数无法处理2038年以后的日期

时间:2019-06-21 18:24:04

标签: php year2038

在Windows上的PHP 7.2.14 64位上,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

2 个答案:

答案 0 :(得分:0)

似乎您遇到了2038年的问题,请参见此处:https://en.wikipedia.org/wiki/Year_2038_problem 您无法在2038年1月19日世界标准时间03:14:07之后对时间进行编码,因此您可以追溯到1901年12月13日。

答案 1 :(得分:0)

我将其报告为bug in PHP,第二天就修复了!一旦知道该修补程序将嵌入哪个PHP版本,我将编辑此答案。