Доступ к датам в PHP за пределами 2038 - программирование
Подтвердить что ты не робот

Доступ к датам в PHP за пределами 2038

Я понимаю, что из-за того, что PHP представляет даты с использованием миллисекунд, вы не можете представлять даты, прошедшие в 2038 году. У меня есть проблема, когда я хочу рассчитать даты в будущем. Тысячи лет.

Очевидно, я не могу использовать функцию даты php для представления этой даты из-за ограничения, однако у меня есть что-то на моей стороне... Все, что я хочу сделать, это хранить год, месяц и день. Меня не интересуют час, минута, секунды и миллисекунды.

Правильно ли я полагаю, что, не включив эту дополнительную информацию, я должен был бы рассчитать намного больше в будущем, потому что я готов отказаться от большого количества информации. Это какая-то библиотека, которая в настоящее время это делает? Если нет каких-либо советов о том, как подойти к этой проблеме?

4b9b3361

Ответ 1

В качестве альтернативы вы можете использовать класс DateTime, который самостоятельно представляет компоненты времени независимо. Таким образом, он не подвержен ограничению 2038 (если вы не используете:: getTimestamp).

Ответ 2

Вы можете использовать 64-битную платформу.

Размер целого числа зависит от платформы, хотя максимальное значение около двух миллиардов - это обычное значение (это 32 бита). 64-разрядные платформы обычно имеют максимальное значение около 9E18.

Источник.

Узнайте, что ваша платформа имеет 64 бит с var_dump(PHP_INT_SIZE === 8). Если TRUE, ваша система будет 64 бит.

Ответ 3

Вы правы в том, что PHP не позволяет обрабатывать даты > 2038, изначально. Однако существуют библиотеки, такие как этот, которые используют тот факт, что с плавающей запятой 64 бит, что позволяет обойти эту проблему, если необходимо, (Все в предположении, что вы используете 32-битную систему... если вы используете 64-битный, вы в порядке).

Ответ 4

PHP ввел класс Datetime() в версии 5.2 для решения этой проблемы. Но вы все равно должны быть в 64-битной ОС.

Ответ 5

Забудьте о Windows! Даже если вы используете 64-битную версию Apache 64-бит для Windows!

$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 года.