Проблема 2038 в PHP

Немного побуду паникером и задамся вопросом — а готовы ли наши и ваши php-скрипты к наступлению 2038 года?

Для проверки достаточно выполнить следующий код:

  1. <?php
  2. $date = '2040-02-01';
  3. $format = 'l d F Y H:i';
  4. $mydate1 = strtotime($date);
  5. echo '<p>', date($format, $mydate1), '</p>';

Если вам повезет, код выведет что-то похожее на Wednesday 1 February 2040 00:00. А вот если вы увидите дату где-то в далеких 60-х, ваше php приложение подвергнуто проблеме 2038!

Что такое проблема 2038?

2038 — год в котором закончится эпоха Unix. Многие языки, в том числе и php, а также системы, использующие знаковые 32-битные целые числа для хранения дат и времениведут свой отсчет времен от 1 января 1970 года. Максимально возможная дата для таких систем — 03:14:07 19го января 2038 года. В следующую секунду случится непоправимое — старший бит станет равен 1, указывая что текущее время отрицательное.
Да, до этого момента еще 27 лет и может быть еще слишком рано беспокоиться по этому поводу. Трудно представить приложение, которое проживет без изменений еще столько лет. Так что цель этого поста призвать к использованию 64 бит для хранения дат, чтобы потом не было ножиданностей :)

64 бита спасут нас?

Если использовать 64-битную операционную систему с 64 битной версией PHP, проблем возникнуть не должно. Знаковое 64 битное целое дает максимальную дату в 21 раз большую, чем нынешний возраст вселенной — 292 миллиарда лет, плюс минус пару дней.

Поставьте 64 битную ОС и спите спокойно :) .

Какие есть альтернативы?

К счастью, PHP, начиная с версии 5.2, имеет специальный класс DateTime:

  1. $date = '2040-02-01';
  2. $format = 'l j F Y H:i';
  3. $mydate2 = new DateTime($date);
  4. echo '<p>', $mydate2->format($format), '</p>';

DateTime не подвержен проблеме 2038 и прекрасно понимает дату 31 декабря 9999 года.

Возможно иправлять старые проекты и не стоит, но в новых использовать этот класс не помешает.

А что Вы думаете о проблеме 2038?

Запись опубликована в рубрике PHP & MySQL с метками , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">