java - Freemarker 在不同时区打印日期

标签 java date freemarker

我使用的是 Freemarker 版本 2.3.20

我有一个数据结构,其中包含两个日期 - 一个是本地时间,一个是世界协调时间

// 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() 都映射到同一个祖鲁时间的瞬间。

最佳答案

使用 freemarker 2.3.20,您可以使用 iso内置日期:

${departureTimeUtc?time?iso_utc_m_nz}

自 freemarker 2.3.21 以来,此内置函数已弃用,取而代之的是:

${departureTimeUtc?time?string.iso_m_nz_u}

iso_m_nz_u的含义是:

  • iso: 使用 ISO 8601:2004 格式
  • m:精确到分钟
  • nz: 无时区
  • u:使用 UTC 而不是默认时区

可以找到完整的选项列表 here .

关于java - Freemarker 在不同时区打印日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45172946/

相关文章:

java - 基于高效 Camel 内容的路由器 : Route XML messages to the correct recipient based on contained tag with Java DSL

java - 添加文本 java requestDispatcher

sql - 如何比较 Postgresql 中日期时间字段中的日期?

mysql - 查询以查找我的表中缺少的时间间隔内的所有日期

java - 当我构建 Spring Boot 的 Web 项目时,我无法使用 freemarker

java - Spring Boot Freemarker 从 2.2.0 升级失败

java - Java 中的正弦波声音发生器

java - 在不添加 FormLayout 的情况下组合 GridLayout 和 FillLayout?

java - 仅打印毫秒(0 到 999)

java - 如何在 freemarker 模板中按索引获取列表项?