Сенсорная функция в PHP 7 64-битная не обрабатывает даты после 2038 - PullRequest
0 голосов
/ 21 июня 2019

В PHP 7.2.14 64-бит , в Windows touch() не может установить дату файла на дату после 2038 года. filemtime() будет считывать такую ​​дату штрафа файла (дата была установлена ​​с внешний инструмент).

Это ожидаемое поведение?
Можно ли написать код, который изменяет дату файла удобным для Y2038 способом?
Кажется, проблема не в отслеживании ошибок PHP: Поиск "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>';
}

Ouput:

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 голосов
/ 03 июля 2019

Я сообщил об ошибке в PHP , и она была исправлена ​​на следующий день!Я отредактирую этот ответ, как только узнаю, в какую версию PHP попадет исправление.

0 голосов
/ 21 июня 2019

Кажется, что вы столкнулись с проблемой 2038 года, см. Здесь: https://en.wikipedia.org/wiki/Year_2038_problem Вы не можете кодировать время после 03:14:07 UTC 19 января 2038 года, поэтому вы возвращаетесь к 13 декабря 1901 года

...