Новые возможности форматирования дат

В версии 0.4 значительно улучшены возможности по работе с датами. Ввиду большого числа писем по этому поводу, опишу здесь основные моменты и правила пользования новыми параметрами форматирования дат:

0. Вступление.

За оформление даты в Smarty-шаблоне отвечает тот же, что и раньше, smarty-тег {date_format}. Тег требует только один обязательный параметр 'date' — собственно дата. Простейший вариант вывода:
{date_format date=$oTopic->getDateAdd()}

в результате получаем самый обычный:
10 декабря 2009, 00:35

Информация для разработчиков: date_format работает теперь не через функцию в function.php, а через специально написанный для движка smarty-плагин.

1. Многоязычность и поддержка нескольких форм склонений в названиях месяцев.

Названия месяцев задаются в lang-файле (по умолчанию russian.php) в виде двухмерного массива. Для каждого месяца можно указывать произвольное число склонений. Например,

...
'date_month_1'  => array('январь','января','январе'),
...

По умолчанию, будет использовано второе склонение, если нужно другое, его индекс нужно указать с помощью параметра «declination». В совокупности с параметром «format», вы можете поменять вывод даты, например на такой:
{date_format date=$oTopic->getDateAdd() format="Y, F, d" declination="0"}

на выходе получим:
2009, декабрь, 10

Параметр 'format' работает также, как описано здесь, за исключением того, что F (полнотекстовое название месяца) будет заменено на нужный язык и выбранное склонение.

2. «Вчера», «Сегодня», «Завтра».

Дополнительный параметр 'day' дает возможность выводить сообщения такого типа:
Сегодня в 03:00

Для этого достаточно указать следующие настройки:
{date_format date=$oTopic->getDateAdd() day="day H:i"}

(day подставляется из lang-файла, согласно временному соответствию — «Вчера в », «Сегодня в», «Завтра в»).

'day' является «параметром-надстройкой» и никак не влияет на основное значение формата. Т.е. если ваша запись была сделана позавчера, то дата будет отформатирована согласно 'format' (или по-умолчанию, если таковой не передан).

3. Только что.

Для того, чтобы указать вместо конкретного значения даты такое:
Только что

Нужно добавить в тег параметр 'now'. Значение now указывает на количество секунд, в течение которых дата будет считаться только что произошедшей.
{date_format date=$oTopic->getDateAdd() now="60"}

Такое правило форматирования будет помечать топик «Только что» в течении 1 минуты с момента написания.

4. Обратный отсчет.

Доступны два режима обратного отсчета: "__ минут назад" и "__ часов назад". Для получения такого эффекта в отображении даты необходимо использовать параметры 'minutes_back' и 'hours_back' соответственно. При этом будет выведено что-то в стиле:
142 минуты назад

или
2 часа назад

'minutes_back' указывается в минутах, 'hours_back' в часах. Параметры работают независимо друг от друга. Плагин самостоятельно следит за склонением существительных «минута», «час» (настройки задаются через lang-файл).

5. Подведем итоги.

Формат типа
{date_format date=$oTopic->getDateAdd() hours_back="12" minutes_back="60" now="60" day="day H:i" format="d F Y, H:i"}

будет 1 минуту отображаться как «Только что», в течении часа как "__ минут назад", в течении 12 часов как "__ часов назад", после 12 часов до окончания 2х суток будет смотреться как «Сегодня в часы: минуты» \ «Вчера в часы: минуты», в остальное время будет отображен как и стандартная дата LS.

Экспериментируйте! Пожелания, баги — милости прошу в комментарии.

18 комментариев

avatar
«То, что доктор прописал» (с)
Огромное спасибо Вам, за такие даты!!!
avatar
Отлично! :-)

А в этот раз предусмотрено изменение времени по часовым поясам?
  • Carw
  • 0
avatar
Ты имеешь ввиду возможность для пользователя указать свой часовой пояс в профиле? Нет, такого пока нет.
avatar
Да, чтобы каждый свое время видел нормально, а не писал в прошлом/будущем :-)
avatar
подскажите, кроме russian.php ну и соответствующего шаблона, что-то еще нужно изменять? добавила в рашен.пхп
'day' => array('Вчера в ','Сегодня в','Завтра в'),
	'minutes_back' => ' минут назад',
	'hours_back' => ' часов назад',
	'now' => 'Только что',
ну а также всех месяцев… что же еще нужно изменить...?
avatar
В SVN версии все готово, там ничего доделывать не нужно.

Для использования в 0.3.1 перетянуть соответствующие куски Lang файла, два смарти-плагина (date_format, declention), отключить во Viewer`e определение smarty-функции date_format, обновить модуль LsLang (туда тоже добавлены некоторые новые возможности, которые используются данным плагином)…

И, кажется, все. Хотя мог что-то упустить из виду.
avatar
С нетерпением ждём релиза четвёрки :)
avatar
Ссылаясь на документацию Smarty по работе с датами, хотелось бы задать такой вопрос: будет ли в движке в шаблоны передаваться именно timestamp (unix time), а не mysql-строка, содержащая информацию о дате и времени? Возникла необходимость сравнить в шаблоне две даты и как-то на результат сравнения среагировать. Smarty дату в формате юникс-тайм нормально должен обработать модификатором date_format, а вот date_rus из коробки выдаёт 1970 год.

Подправить под себя я могу, но хотелось бы, чтобы в движке всё красиво было по дефолту.

Спасибо.
avatar
Мне кажется неправильным использовать strtotime() прямо в шаблоне, когда в документации явно указано, как кошернее поступать с датами.
avatar
Не понял, что значит вот это:
mysql-строка, содержащая информацию о дате и времени

Что за mysql-срока? В параметр date во всех шаблонах передается дата в формате, стандартном для сущностей: «Y-m-d, H:i:s». Но плагин прекрасно понимает и timestamp.

Вот этого замечания тоже не понял:
чтобы в движке всё красиво было по дефолту

Плагин date_format специально разработан для этого движка, чтобы пользователи могли сделать дату так, как они сами считаю красивым. Если вам кажется, что удобнее пользоваться нативными smarty-средствами, пожалуйста, пользуйтесь. Но кто сказал, что это будет красивше?
avatar
Из чтения документации mysql, я понял, что даты там хранятся не в unix-time, а в каком-то таком виде
'0000-00-00 00:00:00'
. Ну и напрямую сравнить например
{$oTopic->getDateAdd()}
и
{$smarty.now}
нельзя.
Но плагин прекрасно понимает и timestamp
Гм. Посмотрю внимательней. Но при попытке скормить ему результат функции strtotime() я получил 1 января 1970 года. Обновлю этот момент до версии из транка.
Вот этого замечания тоже не понял

А это был не на date_format наезд, а на такие конструкции
strtotime($oTopic->getDateAdd())<$smarty.now
в шаблоне.
Отсюда:
This allows template designers to use the date_format modifier for full control over date formatting, and also makes it easy to compare dates if necessary.
Вот о чём я.

Я бы предложил сделать везде вот так:
public function getDate() {
        return strtotime($this->_aData['date']);
    }
и сеттеры соответственно изменить.

Плагин date_format специально разработан для этого движка
То есть, это не из стандартной поставки Smarty?
avatar
Нет, не из стандартной поставки. Этот плагин писал лично нами.
avatar
Спасибо большое! Как раз понадобилось.
  • kote
  • 0
avatar
а как можно перевести часы на всем сайте? сервер в америке и отсчет рвемени идет от них, для рунета все посты идут из прошлого.
если есть возможность исправить время — ткните носом. спасибо.
avatar
В конфигурации установи set_default_timezone()
avatar
я не силен в программировании, как это правильно записать? сдвиг на +9 часов
avatar
сделайте функцию по сдвигу по времени на всем сайте: топики, каменты, кто онлайн итд итп. гемор какой-то…
avatar
отвечайте
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.