28 октября, 2014

Ubuntu - обновленные библиотеки libicu с последними изменениями временных зон

Октябрьское обновление таймзон уже успело неплохо попить крови системных администраторов. Ведь во многих случаях недостаточно простого обновления tzdata, т.к. некоторые пакеты и библиотеки используют свою базу временных зон.

Наши разработчики используют Symfony2, и кое-где версия фреймворка ниже 2.6, а значит Symfony forms использует icu, и обновлять последний как-то мало кто торопится.
Поводом для написсания данного поста стал пост об этой же проблеме на хабре, но там рассматривалось решение проблемы для CentOS.

Мы используем преимущественно ubuntu, поэтому я сделал PPA с обновленными библиотеками (для 12.04 и 14.04).

Возьмем тестовый скрипт из той статьи на хабре и проверим на Ubuntu с «родным» icu:
<?php
$dateIn = '27.10.2014';
$tz = 'Europe/Moscow';
date_default_timezone_set($tz);
$intlDateFormatter = new \IntlDateFormatter('ru_RU', 2, -1, $tz, 1, 'dd.MM.yyyy');
$timestamp = $intlDateFormatter->parse($dateIn);

var_dump($intlDateFormatter->format($timestamp));
var_dump(date('d.m.Y', $timestamp));
И выполним его:
php ./icutz.php 
string(10) "27.10.2014"
string(10) "26.10.2014"
Всё плохо. Теперь подключим ppa и обновим библиотеку из него:
sudo add-apt-repository -y ppa:rzz/icu && sudo aptitude update
Обновляем libicu
Для Ubuntu 12.04: sudo aptitude safe-upgrade libicu48
Для Ubuntu 14.04: sudo aptitude safe-upgrade libicu52

Снова запускаем наш скрипт:
php ./icutz.php 
string(10) "27.10.2014"
string(10) "27.10.2014"
Готово! Но вообще, конечно, я рекомендую помимо всего прочего обновить версию Symfony, чтобы отвязаться от icu насовсем.

UPD, 12 Ноября 2014: в связи с поступившими просьбами сделать обновленный пакет icu 5.2 для 12.04, icu 4.8 переехал в отдельный PPA: ppa:rzz/icu48

4 комментария:

  1. Подскажите, а у вас нет libicu52 для 12.04?
    Дело в том, что в пакете php5.5 (https://launchpad.net/~ondrej/+archive/ubuntu/php5) идет именно icu52

    ОтветитьУдалить
    Ответы
    1. Попробую собрать на днях, раз есть потребность (вообще, теоретически, пакет должен быть универсальным для 14.04 и 12.04, я версии указал строго скорее для перестраховки).

      Удалить
    2. Приветствую.

      Выложил пакет с icu 5.2 для 12.04, попробуйте. Буду благодарен, если отпишетесь по результатам.
      ЗЫ. icu 4.8 теперь живет в отдельном ppa (см. апдейт поста в самом конце).

      Удалить