【问题标题】:How to display date time as local time without the timezone at the end?如何在最后没有时区的情况下将日期时间显示为当地时间?
【发布时间】:2019-07-11 08:56:24
【问题描述】:

编辑:由于一些看似混乱,让我澄清一下。如果可能的话,我希望在 freemarker 中而不是在 java 中完成解决方案。

我有一个如下所示的日期时间字符串:2019-03-12T16:02:00+02:00 我必须以这样的特定格式显示它:EEEE dd. MMMM yyyy HH:mm 但是,如果我这样做,它会将时间显示为14:02 而不是16:02。 它将日期时间转换为 UTC,然后显示它。如何让它按原样显示小时和分钟,最后没有“utc”?或任何时区。 Tuesday 12. March 2019 16:02 是所需的输出。

我不知道收件人的时区。

使用iso_local_nz 给我的美国标准显示仍然是错误的。

提前谢谢你。

我已经尝试了所有我能想到的:https://freemarker.apache.org/docs/ref_builtins_date.html#ref_builtin_date_iso

departureScheduled?datetime.iso?string("EEEE dd. MMMM yyyy HH:mmz")?capitalize

我使用的配置如下:

config = new Configuration(Configuration.VERSION_2_3_28);
config.setTemplateLoader(new S3TemplateLoader());
config.setDefaultEncoding("UTF-8");
config.setLocalizedLookup(false);
config.setLocale(Locale.forLanguageTag("NO"));
config.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);

输入的字符串是我上面提供的字符串。

【问题讨论】:

  • 你可以使用 java 8 中的 LocalDateTime
  • 它显示您所要求的时区,z 在模式的末尾。至于“按原样”显示时间,没有这样的事情,因为输入字符串中有一个时区。但是,如果您将 FreeMarker 的时区配置设置为 GMT+02,您将按原样返回时间。这行得通吗?
  • @ddekany 是的,如果模板中的所有日期都使用相同的时区,这将起作用。如果我想“按原样”显示12:00+03:00 - 16:00+02:00,那么它将打印为12:00 - 16:00。如果我设置一个模板时区,那么其中一个时间会相差一小时。
  • @NoobsDeSroobs 所以在这种情况下你想显示12:0016:00?这很奇怪,因为没有一个时区是正确的当地时间。无论如何,如果这仍然是需要的,那么你必须像你一样从字符串中删除时区,这样它们实际上就变成了本地日期时间。
  • @ddekany 是的,我的时间与不同的时区有关,因此我必须根据这些时区显示时间。想象一张机票。出发和到达时区分别反映在每个显示的日期和时间中。谢谢。

标签: java datetime timezone freemarker


【解决方案1】:

使用类java.time.OffsetDateTime 来处理偏移:

public static void main(String[] args) {
    String t = "2019-03-12T16:02:00+02:00";
    OffsetDateTime odt = OffsetDateTime.parse(t);
    System.out.println(odt.format(DateTimeFormatter.ofPattern("EEEE dd. MMMM yyyy HH:mm")));
}

这打印Dienstag 12. März 2019 16:02,翻译取决于您的系统默认Locale

请注意,正确的代码不会产生您想要的输出,因为 2019 年 3 月 12 日是星期二而不是星期一。

【讨论】:

  • 我认为 OP 正在寻找 FreeMarker 解决方案。
  • 不是我要找的答案,但感谢您指出我的工作日有误。
【解决方案2】:

到目前为止,这不是一个好的解决方案,但它适用于我想要显示的时间在原始字符串被解析之前存在的一种情况。

departureScheduled?keep_before("+")?datetime.iso?string("EEEE dd. MMMM yyyy HH:mm")?capitalize

注意keep_before("+")

上述解决方案的工作原理是删除2019-03-12T16:02:00+02:00+ 之后的所有内容。然后,日期时间解析器假定时间为 UTC。因此,我通过使用内置的字符串操作函数来避免整个问题,该函数返回不会进一步修改的子字符串:2019-03-12T16:02:00(+00:00)。括号显示它是如何解释的。

如果有人有更好的答案,我会将其标记为正确,但几天后,如果没有给出答案,我会为可能遇到相同问题的任何人标记为正确。

【讨论】:

  • 请注意,当您从字符串中删除时区偏移量,然后对其进行解析时,它会在默认时区中进行解释(在 FreeMarker 中可配置,但通常是系统默认时区) ,而不是 UTC。然后,当您对其进行格式化时,它会再次以默认时区呈现。这就是它起作用的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2020-03-15
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
相关资源
最近更新 更多