Ответ 1
Последняя 32-битная Целочисленная метка времени будет достигнута 19 января 2038 года. Это называется проблема 2038 года.
Это своего рода глупый вопрос, но каково будет максимальное значение INT time()
и его будущая дата, например.
1 января 2999 г.
Будет ли время() когда-либо доходить до этого значения? Переход к большому значению time()
вернет это:
Чт 1 янв 1970 1:00 утра
Нормальная дата int
1287320788 - выходы сегодня дата: вс 17 окт 2010 2:06 вечера
Но мне любопытно только самая большая дата int и последняя дата.
Последняя 32-битная Целочисленная метка времени будет достигнута 19 января 2038 года. Это называется проблема 2038 года.
PHP хранит наивысшее целое число, которое он может представлять в константе PHP_INT_MAX
:
date('Y-m-d H:i:s', PHP_INT_MAX); // 2038-01-19 04:14:07
Если вы хотите работать с датами, выходящими за рамки этого, рассмотрите возможность использования DateTime API, например
$dt = new DateTime('1st January 2999');
$dt->add(DateInterval::createFromDateString('+1 day'));
echo $dt->format('Y-m-d H:i:s'); // 2999-01-02 00:00:00
echo $dt->format('U'); // 32472226800
Помните, что проблема с Y2038 не применяется в 64-битных системах.
Самый короткий путь, который я знаю, - это получить дату завтра:
date ( "Y-n-j", strtotime ( "+ 1 день" ))
date("Y-n-j", PHP_INT_MAX)
на 64-битных системах дает потенциально опасное значение: 292277026596-12-4
DateTime, похоже, также использует 32-битную на 64-битных серверах. Таким образом, вы попадаете в неприятности.
Я решил это так:
new DateTime("99999/12/31 00:00:00");
Поскольку дата переполняет максимальную длину для DateTime, дата использует максимальное возможное значение и возвращает объект DateTime, подобный этому (проверяется с помощью var_dump):
object(DateTime)#9 (3) { ["date"]=> string(19) "2031-09-12 00:00:00" ["timezone_type"]=> int(3) ["timezone"]=> string(13) "Europe/Berlin" } }
Я не уверен, отличается ли он от версий PHP. Я тестировал его с версией 5.4.
На 64-битных платформах PHP_INT_MAX
не отражает максимальное значение INT для 32-разрядных платформ. Вот как это получить:
$max32bitInt = PHP_INT_SIZE == 4 ? PHP_INT_MAX : PHP_INT_MAX>>32;
Если вы всегда используете 64-битную платформу, просто используйте:
PHP_INT_MAX>>32