Форматирование времени через расширение intl

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
Filsh
Сообщения: 77
Зарегистрирован: 2010.10.17, 11:00
Откуда: Днепропетровск
Контактная информация:

Форматирование времени через расширение intl

Сообщение Filsh »

Собственно столкнулся с непонятной проблемой, а именно IntlDateFormatter форматирует дату с неправильной timezone

Код: Выделить всё

date_default_timezone_set('Europe/Kiev');

$time = time();

$formatter = new IntlDateFormatter('ru', IntlDateFormatter::MEDIUM, IntlDateFormatter::FULL, date_default_timezone_get());

var_dump(gmdate('d.m.Y H:i:s O', $time)); // 09.03.2014 08:36:44 +0000
var_dump(date('d.m.Y H:i:s O', $time)); // 09.03.2014 10:36:44 +0200
var_dump($formatter->format($time)); // 09.03.2014 11:36:44 GMT+03:00
var_dump(date('Z')); // 7200 
 
хотя по Москве все показывает верно

Код: Выделить всё

date_default_timezone_set('Europe/Moscow');

$time = time();

$formatter = new IntlDateFormatter('ru', IntlDateFormatter::MEDIUM, IntlDateFormatter::FULL, date_default_timezone_get());

var_dump(gmdate('d.m.Y H:i:s O', $time)); // 09.03.2014 09:37:02 +0000
var_dump(date('d.m.Y H:i:s O', $time)); // 09.03.2014 13:37:02 +0400
var_dump($formatter->format($time)); // 09.03.2014 13:37:02 Московское стандартное время
var_dump(date('Z')); // 14400 
 
Такое ощущение что используется летнее время и не верные базы timezone. Как это исправить?

P.S. Я пробовал расширение php5-intl и pecl intl + timezonedb, все равно не помогает
andrew72ru
Сообщения: 1
Зарегистрирован: 2014.04.20, 16:36

Re: Форматирование времени через расширение intl

Сообщение andrew72ru »

Думаю, что за год решение было найдено, однако всё равно напишу, вдруг пригодится кому. Я просто сам вот на днях столкнулся с этим.
Нужно обновить непосредственно ICU до версии с обновленной базой данных часовых поясов. Я брал здесь http://site.icu-project.org/download/54m1
К сожалению, de-пакета я не нашел, поэтому собирал из исходников. После установки новой ICU нужно пересобрать (переустановить) intl и перезапустить сервисы.

Код: Выделить всё

namespace console\controllers;

use \yii\console\Controller;
use \yii\helpers\Console;
use \yii\helpers\VarDumper;

class TestController extends Controller
{
    public $color = true;
    public function actionIndex()
    {
	$dateFormater = \IntlDateFormatter::create('ru_RU', \IntlDateFormatter::LONG, 
		\IntlDateFormatter::LONG, 
		date_default_timezone_get());
	$this->stdout(date_default_timezone_get() . "\n");
	$this->stdout($dateFormater->format(strtotime("now")) . "\n");
        $this->stdout(date("d.m.Y, H:i", strtotime("now")) . "\n");
        $this->stdout(\Yii::$app->formatter->asDateTime(strtotime("now"), "php:d.m.Y, H:i"));
        $this->stdout("\n");
    }
}
Ответ

Код: Выделить всё

Asia/Yekaterinburg
4 марта 2015 г., 21:55:24 GMT+5
04.03.2015, 21:55
04.03.2015, 21:55
Ответить