【问题标题】:Java: ZonedDateTime - parse timestring without timezoneJava: ZonedDateTime - 解析没有时区的时间字符串
【发布时间】:2018-12-07 13:08:51
【问题描述】:

我有一个没有指定时区的日期时间字符串。 但我想用 ZonedDateTime 解析它,以便在解析过程中赋予它一个时区含义。

此代码正在运行,但使用 LocalDateTime 进行解析 - 然后将其转换为 ZonedDateTime 并为其赋予时区含义。

DateTimeFormatter dtf = DateTimeFormatter.ofPattern ("yyyyMMddHHmm");

String tmstr = "201810110907";

LocalDateTime tmp = LocalDateTime.parse (tnstr,dtf);
ZonedDateTime mytime = ZonedDateTime.of (tmp, ZoneId.of ("UTC"));

有没有办法可以直接用 ZonedDateTime 解析它?

我试过了,但是没用。

mytime = mytime.withZoneSameInstant(ZoneId.of("UTC")).parse(str,dtf);

【问题讨论】:

  • 您已经知道格式...是什么阻止了您将具有正确时区的字符串附加到原始日期字符串?
  • 顺便说一下,我建议对您的数据发布者进行有关ISO 8601 格式的教育。您的问题中看到的格式接近于符合日期与时间标准格式的“基本”变体。要完全遵守,请在日期部分和时间部分之间插入T"20181011T0907"。更好地使用扩展变体,默认情况下也在 java.time 类中使用:"2018-10-11T09:07"。如果打算将带时间的日期视为 UTC,则通过在末尾附加 Z 来说明:"2018-10-11T09:07Z"

标签: java zoneddatetime


【解决方案1】:

您可以在格式化程序上指定默认时区:

    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMddHHmm")
            .withZone(ZoneId.of("UTC"));
    String tmstr = "201810110907";
    ZonedDateTime mytime = ZonedDateTime.parse(tmstr, dtf);
    System.out.println(mytime);

输出:

2018-10-11T09:07Z[UTC]

额外提示:使用ZoneOffset.UTC 通常比使用ZoneId.of("UTC") 更好。如果您接受将输出打印为 2018-10-11T09:07Z 而不是(Z 表示 UTC)。

【讨论】:

  • 一旦我将HHmm 设为可选并且不在字符串中提供时间,这将不起作用。知道如何解决吗?
  • @MarkJeronimus 然后您需要使用DateTimeFormatterBuilder 并使用它的parseDefaulting 方法来指定您想要的一天中的哪个时间(如果它不在字符串中)。有一些例子,请搜索。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-10
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多