I18N DateFormat

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

I18N DateFormat

Сообщение slavcodev »

Баг или задумка авторов, причем очень неудобная задумка?

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

date(CLocale::getInstance('ru')->getDateFormat()); 
выдал 0101.MayMay.09090909 что немного запутало :(
после долгого ковыряния мануала единственный выход который мне пришел на ум чтоб вывести дату в нормальном виде это

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

CLocale::getInstance('ru')->dateFormatter->formatDateTime(time()) 
либо если использовать текущюю локаль, то

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

Yii::app()->dateFormatter->formatDateTime(time()); 
Жду Yii 3!

Аватара пользователя
samdark
Администратор
Сообщения: 9353
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: I18N DateFormat

Сообщение samdark »

Похоже, кто где-то по инерции использовано что-то вроде «dd.mm.yyyy». Надо найти по коду. Если найдётся — точно баг.

Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: I18N DateFormat

Сообщение slavcodev »

Александр, не похоже а так и есть.
CLocale::dateFormat выдает формат по CLDR, но смысл в этом формате?
и не могу найти функцию которая конвертирует в формат для PHP.
Жду Yii 3!

Аватара пользователя
samdark
Администратор
Сообщения: 9353
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: I18N DateFormat

Сообщение samdark »

А в мануале это вроде описано… надо использовать CDateFormatter:

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

Yii::app()->dateFormatter->formatDateTime(time());
 
При верно выставленной локали отдаёт:
02.05.2009 13:46:47

Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: I18N DateFormat

Сообщение slavcodev »

А если мне нужно только дата то без танцев не получится сделать (
Жду Yii 3!

Аватара пользователя
samdark
Администратор
Сообщения: 9353
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: I18N DateFormat

Сообщение samdark »

Почему не получится?

http://www.yiiframework.com/doc/api/CDa ... ter#format

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

Yii::app()->dateFormatter->format('dd.MM.yyyy', time());
 

Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: I18N DateFormat

Сообщение slavcodev »

В моем случае т.к. локаль не известа заранее, то это выглядит так

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

Yii::app()->dateFormatter->format(CLocale::getInstance($localeId)->getDateFormat(), time()); 
используя текущюю локаль тоже жуть

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

Yii::app()->dateFormatter->format(Yii::pp()->locale->getDateFormat(), time()); 
уже разобрался, но много букв :)
Жду Yii 3!

BerdArt
Сообщения: 38
Зарегистрирован: 2009.11.21, 14:31
Откуда: ZP
Контактная информация:

Re: I18N DateFormat

Сообщение BerdArt »

А никто не пробывал форматировать даты до 1970 года? Похоже их он не воспринимает, потому что заменяет все на 01.01.1970. А как же тогда быть, если надо отформатировать дату допустим 09.06.1870 ? А если не форматировать, а просто вывести значение поля, то получаю вот такое значение: Jun 9 1870 12:00AM

Аватара пользователя
Caveman
Сообщения: 152
Зарегистрирован: 2009.04.04, 20:56
Откуда: Москва
Контактная информация:

Re: I18N DateFormat

Сообщение Caveman »

BerdArt писал(а):А никто не пробывал форматировать даты до 1970 года? Похоже их он не воспринимает, потому что заменяет все на 01.01.1970. А как же тогда быть, если надо отформатировать дату допустим 09.06.1870 ? А если не форматировать, а просто вывести значение поля, то получаю вот такое значение: Jun 9 1870 12:00AM
Для манипуляций с датами за границами Unix-time используем класс CTimestamp

BerdArt
Сообщения: 38
Зарегистрирован: 2009.11.21, 14:31
Откуда: ZP
Контактная информация:

Re: I18N DateFormat

Сообщение BerdArt »

Чето я не пойму как им пользоваться. сервер мне возвращает строку даты типа такой (это я ее вывел с помощью var_dump):

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

string(18) "Jun 9 1870 12:00AM" 
. В Ctimestamp::formatDate() дата должна быть передана как integer. Если я передаю туда свою строку, то ничего не получаю...

Аватара пользователя
samdark
Администратор
Сообщения: 9353
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: I18N DateFormat

Сообщение samdark »

Туда не дата должна быть передана, а timestamp.

BerdArt
Сообщения: 38
Зарегистрирован: 2009.11.21, 14:31
Откуда: ZP
Контактная информация:

Re: I18N DateFormat

Сообщение BerdArt »

Caveman писал(а):
BerdArt писал(а):А никто не пробывал форматировать даты до 1970 года? Похоже их он не воспринимает, потому что заменяет все на 01.01.1970. А как же тогда быть, если надо отформатировать дату допустим 09.06.1870 ? А если не форматировать, а просто вывести значение поля, то получаю вот такое значение: Jun 9 1870 12:00AM
Для манипуляций с датами за границами Unix-time используем класс CTimestamp
Мне так тоже казалось, но вот Caveman сказал по-другому, и я решил послушать умного человека... Так как же мне отформатировать дату 1870 года ???

Аватара пользователя
Caveman
Сообщения: 152
Зарегистрирован: 2009.04.04, 20:56
Откуда: Москва
Контактная информация:

Re: I18N DateFormat

Сообщение Caveman »

Так в CTimestamp::formatDate тоже надо передавать timestamp.
Давайте поподробнее, что у Вас на входе и что должно получиться в итоге.

Думаю, Вам надо передавать в CTimestamp::formatDate результат метода CTimestamp::getTimestamp

BerdArt
Сообщения: 38
Зарегистрирован: 2009.11.21, 14:31
Откуда: ZP
Контактная информация:

Re: I18N DateFormat

Сообщение BerdArt »

Caveman писал(а):Давайте поподробнее, что у Вас на входе и что должно получиться в итоге.
В БД есть поле типа datetime. В PHP оно переделывается в string по правилам, указаным в классе CMssqlColumnSchema. Поэтому в модели тип поля - string и дата 09.06.1870 хранится в виде строки: string(18) "Jun 9 1870 12:00AM" . А в итоге я хочу получить дату в обычном русском форматировании. Т.е. для приведенного примера, я хочу следующий результат: "Jun 9 1870 12:00AM" -> "09.06.1870".
Caveman писал(а):Думаю, Вам надо передавать в CTimestamp::formatDate результат метода CTimestamp::getTimestamp
В CTimestamp::getTimestamp я должен передать все частички даты (час, минута, секунда, день, месяц, год) в виде числа. Для этого мне надо самому пропарсить строку "Jun 9 1870 12:00AM", все конвертировать в integer.... В таком случае, мне проще самому написать конвертер, который будет выдавать нужный мне результат. Но хотелось, бы использовать, то что есть, а не изобретать велосипед.

Аватара пользователя
Caveman
Сообщения: 152
Зарегистрирован: 2009.04.04, 20:56
Откуда: Москва
Контактная информация:

Re: I18N DateFormat

Сообщение Caveman »

Да, похоже, что тут не надо мудрить, а одной регуляркой преобразовать...

SpiLLeR
Сообщения: 350
Зарегистрирован: 2009.09.17, 16:47
Откуда: Санкт-Петербург
Контактная информация:

Re: I18N DateFormat

Сообщение SpiLLeR »

(PHP 5 >= 5.2.0)

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

$str = "Jun 9 1870 12:00AM";
$t = date_parse($str);
echo $t['month'].'.'.$t['day'].'.'.$t['year'].' ';
Предупрежден - значит вооружен.
devKP.ru

Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: I18N DateFormat

Сообщение slavcodev »

SpiLLeR писал(а):(PHP 5 >= 5.2.0)
(PHP 5 >= 5.1.3)
Жду Yii 3!

SpiLLeR
Сообщения: 350
Зарегистрирован: 2009.09.17, 16:47
Откуда: Санкт-Петербург
Контактная информация:

Re: I18N DateFormat

Сообщение SpiLLeR »

В мануале написано (PHP 5 >= 5.2.0) http://php.net/manual/en/function.date-parse.php
Проверить в более ранних версиях не могу, но если работает - хорошо :)
Предупрежден - значит вооружен.
devKP.ru

SpiLLeR
Сообщения: 350
Зарегистрирован: 2009.09.17, 16:47
Откуда: Санкт-Петербург
Контактная информация:

Re: I18N DateFormat

Сообщение SpiLLeR »

В продолжение темы:
Есть метод, он возвращает timestamp:

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

 CDateTimeParser::parse($post->createTime, 'yyyy-MM-dd HH:mm:ss');
 

для данной даты он вернет -3128684400. Только все встроенные методы используют getdate(), который не работает с отрицательными значениями и будет возвращать некорректную дату.
Предупрежден - значит вооружен.
devKP.ru

Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: I18N DateFormat

Сообщение slavcodev »

SpiLLeR писал(а):В продолжение темы:
Есть метод, он возвращает timestamp:

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

 CDateTimeParser::parse($post->createTime, 'yyyy-MM-dd HH:mm:ss');
 

для данной даты он вернет -3128684400. Только все встроенные методы используют getdate(), который не работает с отрицательными значениями и будет возвращать некорректную дату.
Ему не подойдет, так как у него месяц буквенный, а у метода parse там нет такого формата.
Жду Yii 3!

Ответить