#java #freemarker #fmpp
#java #freemarker #fmpp
Вопрос:
У меня есть csv-файл, который я хочу преобразовать с помощью fmpp (freemarker). Первый столбец представляет собой длинное значение (миллисекунды с 1.1.1970), которое я хочу преобразовать в дату и отформатировать его как datetime.
формат src:
timeStamp,elapsed,label,responseCode,threadName,dataType,success,bytes,URL,Latency
1319115474244,40142,Login,200,Login 1-2,text,true,862184,http://localhost:8080/xxx,5378
желаемый целевой формат:
timeStamp;elapsed;label;responseCode;threadName;dataType;success;bytes;URL;Latency
20.12.2011 13:45;40142;Login;200;Login 1-2;text;true;862184;http://localhost:8080/xxx;5378
Мой (работающий) шаблон:
<#list csv.headers as h>${h}<#if h_has_next>;</#if></#list> <#list csv as row> <#list csv.headers as h><#if h_index == 0>Do the date magic<#else>${(row[h]!"N/A")?string}</#if>
lt;#if h_has_next>;</#if></#list>
</#list>
Для столбца 0 я хочу выполнить преобразование. Я НЕ хочу писать новую модель, которая содержит дату. Мой вопрос в том, можно ли это сделать в шаблоне без изменения freemarker или fmpp.есть идеи?
Ответ №1:
FreeMarker 2.3.17 представил ?number_to_date
, ?number_to_time
и ?number_to_datetime
для этого. Смотрите: http://freemarker.org/docs/ref_builtins_expert.html#ref_builtin_numToDate
Вы также захотите установить формат даты / времени и зону; см. http://fmpp.sourceforge.net/settings.html#sect17
Возможно, вам придется обновить FreeMarker в FMPP. Для этого просто замените <FMPP_HOME>/lib/freemarker.jar
на последнюю версию.
Комментарии:
1. спасибо! Должно быть, я наблюдал за этим в документации. Один совет для других. Вы должны преобразовать строку сначала в число, а затем в дату-время следующим образом: $ {(row[h])?number?number_to_datetime} . Формат даты и времени для вывода можно задать с помощью: <#настройка datetime_format=»гггг-ММ-дд чч: мм: сс»>
2. Спасибо! Находясь в разделе «Редко используемые и экспертные встроенные модули», можно точно сказать, что эта информация была скрыта. Очень признателен!
3. @MaxRocket Да, большая часть этого раздела, вероятно, должна быть растворена в других…
Ответ №2:
В моей ситуации я использую это:
$ {(timeStamp)?number_to_date?string(«гггг.ММ.дд»)}
И замените number_to_date
на number_to_datetime
или number_to_time
;
И вы можете заменить yyyy.MM.dd
на YYYY-MM-dd HH:mm:ss
то, что вам нужно.
проверьте это: http://freemarker.org/docs/ref_builtins_expert.html#ref_builtin_numToDate