我使用的是Freemarker版本2.3.20。Freemarker在不同时区打印日期
我有其中两个日期都包含一个数据结构 - 一个在当地时间,一个在UTC时间。
// 2017-07-17 18:30 UTC
ZonedDateTime utcTime = ZonedDateTime.of(2017, 7, 17, 18, 30, 0, 0, ZoneId.of("UTC"));
// 2017-07-17 20:30 (+02:00)
ZonedDateTime localTime = utcTime.withZoneSameInstant(ZoneId.of("Europe/Berlin"));
Freemarker的只能处理java.util.Date
所以我移交日期。
Map<String, Object> mapping = new HashMap<String, Object>();
mapping.put("departureTimeLocal", Date.from(localTime.toInstant()));
mapping.put("departureTimeUtc", Date.from(utcTime.toInstant()));
在我的模板我会想到写这样的:
Departure (local): ${departureTimeLocal?string['HH:mm']}
Departure (UTC) : ${departureTimeUtc?string['HH:mm']}
而作为一个结果,我想看到:
Departure (local): 20:30
Departure (UTC) : 18:30
我看到的目前是:
Departure (local): 20:30
Departure (UTC) : 20:30 <#-- timestamp interpreted in local time -->
我也试过了一些东西像:
Departure (converted): ${(departureTimeLocal?string['yyyy-MM-dd HH:mm'] + ' UTC')?datetime['yyyy-MM-dd HH:mm z']?string['HH:mm']}
--> Departure (converted): 22:30
什么是最好的方式来存档这样的东西?
是的我知道:java.util.Date
并没有真正的时区(仅用于打印)而localTime/utcTime.toInstant()
都映射到祖鲁时间的相同时刻。
一种解决方法是'departureTimeUtc = utcTime.withZoneSameLocal(ZoneId.of(“Europe/Berlin”));' – 2017-07-18 17:40:06
它会给出预期的输出,@ Hugo,但是我们真的不想要这样的黑客攻击有什么办法可以拿出更好的东西... –
@ OleV.V。的确,这就是我称之为“解决方法”的原因。我不使用freemarker,所以我不知道它是否有一些方法来配置日期格式 – 2017-07-18 19:48:06