Freemarker / Velocity - манипулирование датами - PullRequest
1 голос
/ 09 апреля 2010

У меня довольно простой вопрос об этих двух шаблонизаторах.
Я пытаюсь назначить дату будущего / прошлого, фиксированное время, например, 18 месяцев назад или завтра.

Я знаю, что это можно сделать с помощью объекта даты Java внутри шаблона скорости / свободного маркера (что-то вроде $date.add(2,-18)), но я хотел бы сделать это с DateTool или ядром свободного маркера.

Это то, что я считаю чисто презентационным (просто подумайте о датах по умолчанию, которые вы видите в формах бронирования авиабилетов), поэтому я не вижу никакой причины, по которой движок шаблонов не сможет это сделать.

Возможно ли это хотя? Если да, то как?

Ответы [ 6 ]

4 голосов
/ 27 февраля 2015

Я знаю, что это сообщение действительно старое, но для людей из будущего, которые все еще ищут ответ: манипулирование датами может быть выполнено преобразованием дат в / из миллисекунд:

${(mydate?long - 18 * 86400000)?number_to_date?string("yyyy-MM-dd")}

например вычтет 18 дней из mydate. (Обратите внимание, что 86400000 - это количество миллисекунд в день)

1 голос
/ 16 мая 2019

Я обнаружил, что для @Stefan Haberl ?long работает с датами, чтобы получить то же значение, что и java.util.Date.getTime(), как Long. Однако мне нужно было немного больше объяснений, чтобы можно было сравнить даты или изменить даты.

Вот суть:

  1. ?long = java.util.Date.getTime() возвращает время эпохи в миллисекундах
  2. На данный момент вы можете добавлять / вычитать любое количество миллисекунд из этого числа для вашей манипуляции

Мне нравится работать в секундах, а не в миллисекундах (меньше ненужных нулей, меня не волнуют миллисекунды и т. Д.), Что выглядит следующим образом:

[#function convertToUnix date]
  [#return (date?date?long / 1000)]
[/#function]

[#-- Output Unix Timestamp --]
${convertToUnix(.now)}

На данный момент, 86400 = 1 день (потому что мы сейчас в «секундах»), так что вы можете просто добавить / вычесть это, чтобы манипулировать датой.

[#assign
  day = 86400
  week = 7 * day
  avgMonth = 365.25 / 12 * day

  testingEndOfDay = convertToUnix(.now) < (convertToUnix(sameDay) + day)
  testingYesterday = convertToUnix(.now) < (convertToUnix(yesterday) + day)
]
${testingEndOfDay?c} # true, .now is less than the end of the day
${testingYesterday?c} # false, .now is greater than the end of yesterday

Примечание : я игнорирую время суток, мы получили даты, которые начались в 12:00, и хотели проверить на .now на конец дня.

Теперь, если я хочу вернуть дату из формата Unix (в секундах), я могу преобразовать ее обратно, используя ?number_to_date встроенный

[#assign
  nowAsUnix = convertToUnix(.now)
  prettyDate = (nowAsUnix * 1000)?number_to_date
]

Примечание : я открыт для правок / улучшений, так как не уверен, почему многое из этого потребовалось ¯ \ _ (ツ) _ / ¯

1 голос
/ 01 июля 2010

Вы также можете сделать это в Velocity, но не с DateTool (который в любом случае принадлежит Velocity Extras).

Хорошей практикой является использование объекта «Формат» с различными утилитами, которые полезны только для презентационных целей (вы можете увидеть различные фреймворки, которые используют Velocity, как они имеют объекты «Формат»).

Таким образом, ваш код будет выглядеть как $ format.dateFromNow (), и будет все еще презентационный подход.

1 голос
/ 09 апреля 2010

В Velocity Tools такого метода нет.

1 голос
/ 09 апреля 2010

Для freemarker, возможно: Встроенные даты .

0 голосов
/ 03 августа 2012

Вы можете написать свои собственные методы для использования в FreeMarker: http://freemarker.sourceforge.net/docs/pgui_datamodel_method.html

построить DataAddMethod, который выполняет эту логику.

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