Доступ к датам в PHP после 2038 года
Я понимаю, что из-за того, что PHP представляет даты в миллисекундах, вы не можете представлять даты после 2038 года. У меня есть проблема, связанная с тем, что я хочу рассчитывать даты в будущем. Тысячи лет.
Очевидно, что я не могу использовать функцию даты php для представления этой даты из-за ограничения, однако у меня есть кое-что на моей стороне... Все, что я хочу сделать, это сохранить год, месяц и день. Мне все равно на час, минуту, секунды и миллисекунды.
Правильно ли я считаю, что без включения этой дополнительной информации я смогу многое рассчитать в будущем, потому что готов отказаться от большого количества информации. Это какая-нибудь библиотека, которая в настоящее время делает это? Если нет, то есть ли какие-либо советы о том, как подойти к этой проблеме?
5 ответов
Вы также можете использовать DateTime
класс, который внутренне представляет компоненты времени независимо. Таким образом, он не подвержен ограничению 2038 (если вы не используете::getTimestamp).
Вы можете использовать 64-битную платформу.
Размер целого числа зависит от платформы, хотя максимальное значение около двух миллиардов является обычным значением (это 32 бита со знаком). 64-битные платформы обычно имеют максимальное значение около 9E18.
Узнайте, что ваша платформа является 64-битной с var_dump(PHP_INT_SIZE === 8)
, Если TRUE
Ваша система является 64-битной.
PHP ввел класс Datetime() в версии 5.2 для решения этой проблемы. Но вы все равно должны быть в 64-битной ОС.
Вы правы в том, что PHP не позволяет вам обрабатывать даты> 2038, изначально. Однако есть библиотеки, подобные этой, которые используют тот факт, что числа с плавающей запятой являются 64-битными, что позволяет вам обойти эту проблему в случае необходимости. (Все при условии, что вы используете 32-битную систему... если вы используете 64-битную, у вас все в порядке).
Забудь о Windows! Даже если вы используете Apache 64-битный поверх Windows 64-битный!
$timestamp = strtotime('22-09-2508');
var_dump ($timestamp);
// returns bool false using WAMP 64-Bit over Windows 64 Bit
Если вам нужно вычислить метки времени, используйте 64-битную систему (не Windows):
$timestamp = strtotime('22-09-2508');
var_dump ($timestamp);
// returns int 17000496000 using a LAMP Server
Вы можете запустить сервер LAMP с помощью VMWare через Windows, и, скорее всего, ваш конечный хост-сервер также будет использовать эту 64-битную службу.
Другими словами:
if (intval("9223372036854775807")==9223372036854775807) {
// 64-bit
} else {
// 32-bit
}
Понял?
Примечание: time() и getTimestamp() работают нормально в 64-битной среде (linux) после 2038 года.