Как рассчитать разницу в днях между двумя датами ISO8601 с помощью Freemarker?


У меня есть объект в Freemarker, который имеет даты в формате ISO8601 (например, 2012-02-01T13:01:02+0000), как я буду работать над разницей в днях между ним и сейчас?

В других сценариях, отличных от Java, я бы переформатировал его как метку времени unix и сделал математику (как функции distance_of_time_in_words в RoR или Symfony), однако, насколько я могу видеть, Freemarker не может превратить метку времени ISO8601 в метку времени unix.

И да, я понимаю, что слой шаблона, вероятно, не является правильным местом для этого вроде того, но потребности должны быть и т.д.

1 2

1 ответ:

Если под разницей в днях вы подразумеваете, сколько раз 24 часа прошло между двумя датами, то это выражение делает это (вам нужен по крайней мере FreeMarker 2.3.17 для ?long, чтобы работать так):

(
  (
    s2?datetime("yyyy-MM-dd'T'HH:mm:ssZ")?long
    - s1?datetime("yyyy-MM-dd'T'HH:mm:ssZ")?long
  ) / (1000 * 60 * 60 * 24)
)?int

Более приятным подходом является реализация функции в Java с помощью реализации TemplateMethodModelEx. Шаблоны могут вытянуть это с помощью <#assign distanceInDays = 'com.example.DistanceInDaysMethod'?new()> (Поместите это в обычный файл #include - d или #import - ed), а затем вы можете использовать его как distanceInDays(s1, s2).