PHP Extension: Date/Time

Что-то я совсем разленился и перестал быть в курсе нововведений в PHP. Дабы исправить это, я решил перечитать документацию по всем расширениям языка. А заодно и вывалить краткие отчёты по этому на головы моих неподготовленных читателей. Может быть, для других лентяев что-нибудь окажется полезным.

Сегодня рассмотрим новые (относительно) средства для работы со временем, появившиеся в PHP 5.2 (с 5.1 в ранге экспериментальных). Для меня, в большинстве случаев, работа с ними, заканчивается на вызове в начале программы date_default_timezone_set(), иначе при E_STRICT выскакивает предупреждение.

Однако, новые средства довольно забавны и, вполне, могут сделать жизнь проще и веселее.

Класс DateTime

Объект класса DateTime представляет собой аналог метки времени (UNIX TIMESTAMP) в int-переменной.

Кроме объектно-ориентированного синтаксиса, главная радость — это класс является обёрткой над 64-битными числами. То есть, наконец-то, мы не ограничены 1970—2038 годами.

$dt = new DateTime('11 July 1509');
echo $dt->format('d.m.Y H:i'); // 11.07.1509 00:00

Время указывается в том же формате, что и для функции strtotime, что радует — можно напрямую тянуть TIMESTAMP из базы без UNIX_TIMESTAMP(`time`) AS `time`. А вот число (например, new DateTime(time())) указать нельзя, что печалит.

Метод format() выводит время в формате, аналогичном date(). Радует наличие предопределённых констант. Не нужно вспоминать, как там время записывается у кук: $dt->format(DateTime::COOKIE).

В документации приведены ещё множество методов и классов, предназначенных для работы с интервалами, периодами и получением разницы между датами. Но все они доступны, начиная с PHP 5.3, чьего релиза мы никак не можем дождаться.

Часовые пояса

Некоторые думают, что часовой пояс это просто число часов, которое нужно прибавить к Гринвичу. Фигушки. Каких только извращенцев нет, и многие пояса смещены на полчаса или 15 минут. Так же, это смещение может самопроизвольно меняться (переход на летнее время) по труднозапоминаемым закономерностям.

В PHP для работы с часовыми зонами нагородили очень много. Чего стоит только список всех зон, надзон и подзон, что непонятно, как туда ещё не затесался Гудзон.

На большинстве сайтов, всего этого не надо (как не нужны широта, долгота и, прости господи, время восхода). Максимум, что нужно, это предоставить пользователю возможность выбрать свой часовой пояс и один раз, после авторизации, вызвать date_default_timezone_set().

9 комментариев »

  • гут, ман не пришлось читать

    CTAPbIu_MABP, 11.06.2009, 16:25

  • Да, сенкью! Недавно только поднимали этот вопрос, смотрю сам уже все нарыл :)

    // tabindex поставь на «подписка на комментарии»

    adw0rd, 12.06.2009, 0:02

  • Даже и не знал, что они уже входят в базовую комплектацию.
    статья как обычно бест.

    Где у тебя RSS тем в блоге?

    alexey_baranov, 19.06.2009, 14:31

  • alexey_baranov, а у вас браузер не определяет что есть RSS-поток?

    adw0rd, 19.06.2009, 14:37

  • http://blgo.ru/blog/feed/

    vasa_c, 19.06.2009, 14:38

  • Сэнкью вери мач

    alexey_baranov, 22.06.2009, 7:05

  • Блин, круто, а я опять зафтычил. Думал самому писать эту отличную вещь. В Dephi есть тип TDateTime, довольно удобный, правда все преобразования через внешние функции, как бэ… Представляется числом с плавающей точкой, где единица равна суткам. Вот я и думал всё время, ну блин когда же разработчики PHP допрут, что тут надо хотя бы то же самое. И вот оно — свершилось в виде паттерна «Объект-значение» с прибамбасами. Спасибо, особенно тебе Олег!

    kostyl, 24.03.2010, 22:19

  • Мне то за что? :)

    vasa_c, 27.03.2010, 22:14

  • За то, что наставил меня на путь истинный, а то я так бы и писал
    class DateTime {
    const FORMAT_INDEXFIELD = ‘Y-m-d H-i-s’;
    const FORMAT_RUSSIAN = ‘d.m.Y H:i:s’;
    ….

    kostyl, 28.03.2010, 12:22

Leave a comment