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

33
В версии 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.

Экспериментируйте! Пожелания, баги — милости прошу в комментарии.
  • +20
  • 14 декабря 2009, 06:36
  • kachayev

Комментарии (18)

RSS свернуть / развернуть
«То, что доктор прописал» (с)
Огромное спасибо Вам, за такие даты!!!
+1
Отлично! :-)

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

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

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

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

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

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

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

Плагин date_format специально разработан для этого движка, чтобы пользователи могли сделать дату так, как они сами считаю красивым. Если вам кажется, что удобнее пользоваться нативными smarty-средствами, пожалуйста, пользуйтесь. Но кто сказал, что это будет красивше?
-1
Из чтения документации 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?
-2
Нет, не из стандартной поставки. Этот плагин писал лично нами.
-1
Спасибо большое! Как раз понадобилось.
0
  • avatar
  • kote
  • 15 декабря 2009, 16:15
а как можно перевести часы на всем сайте? сервер в америке и отсчет рвемени идет от них, для рунета все посты идут из прошлого.
если есть возможность исправить время — ткните носом. спасибо.
0
В конфигурации установи set_default_timezone()
0
я не силен в программировании, как это правильно записать? сдвиг на +9 часов
0
сделайте функцию по сдвигу по времени на всем сайте: топики, каменты, кто онлайн итд итп. гемор какой-то…
-1
отвечайте
-1
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.