Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
$dater = new Dater(new Dater_Locale_Russian(), 'Europe/Moscow');
$utcDateTime = $dater->format('2012-08-12 12:00:00', 'server_datetime', 'UTC', 'Europe/Minsk');
echo $dater->format($utcDateTime, 'server_datetime', 'Europe/Minsk', 'UTC');
И хранить даты нужно с уканаием пояса. Иначе вы не сможете вернуться в нужный часовой пояс и реальное время, к примеру кода у нас прыгали пояса, или между летним и зимнем временем.
echo $dater->format('2001-07-07 12:00:00', 'time', 'UTC', 'Europe/Moscow') . PHP_EOL;
echo $dater->format('2012-07-07 12:00:00', 'time', 'UTC', 'Europe/Moscow') . PHP_EOL;
$date = new DateTime('2000-01-01', new DateTimeZone('Europe/Moscow'));
echo $date->format('Y-m-d H:i:sP') . PHP_EOL; // 2000-01-01 00:00:00+03:00
$date->setTimeZone(new DateTimeZone('UTC'));
echo $date->format('Y-m-d H:i:sP') . PHP_EOL; // 1999-12-31 21:00:00+00:00
$date->modify('+ 13 year');
echo $date->format('Y-m-d H:i:sP') . PHP_EOL; // 2012-12-31 21:00:00+00:00
$date->setTimeZone(new DateTimeZone('Europe/Moscow'));
echo $date->format('Y-m-d H:i:sP') . PHP_EOL; // 2013-01-01 01:00:00+04:00
$date = new DateTime('2000-01-01 12:00:00', new DateTimeZone('Europe/Moscow'));
echo $date->format('Y-m-d H:i:s P') . PHP_EOL; // 2000-01-01 12:00:00 +03:00
$date->setTimeZone(new DateTimeZone('UTC'));
echo $date->format('Y-m-d H:i:s P') . PHP_EOL; // 2000-01-01 09:00:00 +00:00
$date->setTimeZone(new DateTimeZone('Europe/Moscow'));
echo $date->format('Y-m-d H:i:s P') . PHP_EOL; // 2000-01-01 12:00:00 +03:00
$date = new DateTime('2000-01-01', new DateTimeZone('Europe/Moscow'));
echo $date->format('Y-m-d H:i:sP') . PHP_EOL; // 2000-01-01 00:00:00+03:00
$date->setTimeZone(new DateTimeZone('UTC'));
echo $date->format('Y-m-d H:i:sP') . PHP_EOL; // 1999-12-31 21:00:00+00:00
$date->setTimeZone(new DateTimeZone('Europe/Moscow'));
$date->modify('+ 13 year');
echo $date->format('Y-m-d H:i:sP') . PHP_EOL; // 2013-01-01 00:00:00+04:00
$date->setTimeZone(new DateTimeZone('UTC'));
echo $date->format('Y-m-d H:i:sP') . PHP_EOL; // 2012-12-31 20:00:00+00:00
$date = new DateTime('2000-01-01', new DateTimeZone('Europe/Moscow'));
echo $date->format('Y-m-d H:i:sP') . PHP_EOL; // 2000-01-01 00:00:00+03:00
$date->setTimeZone(new DateTimeZone('UTC'));
echo $date->format('Y-m-d H:i:sP') . PHP_EOL; // 1999-12-31 21:00:00+00:00
$date->setTimeZone(new DateTimeZone('Europe/Moscow'));
$date->modify('+ 13 year');
echo $date->format('Y-m-d H:i:sP') . PHP_EOL; // 2013-01-01 00:00:00+04:00
Dater_Locale_*
? Не лучше ли стандартными строками типа ru_UA
или en_US
(и в идеале ещё и кодировку корректно обрабатывать типа ru_RU.UTF-8
) инициализировать конструктор Dater_Locale
сделав его не абстрактным, а локали хранить или в статическом массиве этого класса, или в «конфигах», или заполнять динамически с помощью setlocale
/strftime
, ну или уж если так нравится, то сделать фабричный статический метод в Dater_Locale, который будет внутри нужный конструктор вызывать?switch
или костыли типа new 'Dater_Locale_'.$locale;
Dater_Locale::getByCode('ru');
по-моему. И маленький пулл-реквест ещё отправил. Было интересно функциональность гитхаба редактирования онлайн проверить :) кому надо сами преобразуют перед вызовом getLocaleByCode.
\.._..\
с \...*\
?__autoload.php
"autoload": {
"psr-0" : {
"Dater_" : "Dater/"
}
}
. Вы же вендор :)\<Vendor Name>\(<Namespace>\)*<Class Name>
В нормальной практике никто так не делает, это крайне неудобно.
(<Namespace>\)*
как бы намекатает, что под-неймспейсов должно быть от 0 и более, а не от 1 и более.$dater->setLocale(new Dater\Locale\En());
echo $dater->getDatePattern(); // 'mm/dd/yyyy'
$dater->setLocale(Dater\Dater::getLocaleByCode('ru'));
echo $dater->getDatePattern(); // 'dd.mm.yyyy'
Dater — определяет часовой пояс, локализует и форматирует время в PHP