0

您好 — 我在 ClickDimensions 模板中使用 FreeMarker,但在强制日期时间使用正确的时区时遇到了一些问题。我的模板顶部有这个:

<#setting time_zone="Canada/Pacific">

我已经玩了一点,将它设置为不同的区域(例如“America/New_York”),并且当我调用它时它会正确调整时间:

${.now}

那太好了。但是......我有一个变量('startdate'),它保存从 Microsoft Dynamics 实例中提取的日期时间值。出于某种原因,它认为这是一个太平洋日期时间(偏移量是 -07:00),但它不是,它是 UTC。

以下是我写的一些例子:

${startdate}
${startdate?datetime("M/d/yyyy h:mm a")}
${startdate?datetime("M/d/yyyy h:mm a")?string.iso_m}
${startdate?datetime("M/d/yyyy h:mm a")?string.iso_m_nz}
${startdate?datetime("M/d/yyyy h:mm a")?string.iso_m_nz_u}

这就是我收到的:

  • 2019 年 5 月 23 日下午 4:30
  • 2019 年 5 月 23 日下午 4:30:00
  • 2019-05-23T16:30-07:00
  • 2019-05-23T16:30
  • 2019-05-23T23:30

第三行揭示了问题——日期时间偏移不正确。它应该是 +00:00 而不是 -07:00。

如何更改与日期时间关联的偏移量...?

4

1 回答 1

1

问题是您解析为日期时间的字符串不包含时区或偏移量。从datetime技术上讲java.util.Date(不是java.time.LocalDateTime,它可以很高兴地保持对时区的无知),FreeMarker 必须盲目地假设某个时区,这将是当前时区。

至少从 2.3.30 开始,对于?datetime.

真正正确的解决方案是将这些日期作为java.util.Date-s 而不是字符串放入数据模型中。理想情况下,将字符串解析为任何对象(java.util.Date在这种情况下)不是模板的职责。

如果您必须在模板中解决这个问题,因为该字符串的格式无论如何都硬连接到模板中,您可以这样做:

<#function parseMsDynDateTime(s)>
  <#return (startdate + " +0000")?datetime("M/d/yyyy h:mm a Z")>
</#function>

接着

${parseMsDynDateTime(startdate)?string.iso_m}
于 2020-07-04T10:08:48.703 回答