【问题标题】:How to parse TZ format time with non-GMT time zone [duplicate]如何使用非 GMT 时区解析 TZ 格式时间 [重复]
【发布时间】:2019-03-28 01:15:58
【问题描述】:

我有两种格式的时间字符串。

2019-03-01T22:22:50.591-08:00   
2019-03-01T22:22:50.591Z

我正在使用下面的 Java sn-p 来解析

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:SS" +
              ".SSS'Z'", Locale.US);
Date date = df.parse(dateString);

它在第二个字符串上工作,但在第一个字符串上失败。有什么通用代码可以同时解析它们?

【问题讨论】:

  • ZonedDateTime.parse()。但我会让巴兹尔详细介绍。
  • 不,它没有。
  • 远离SimpleDateFormatDate。这些类设计不佳且早已过时,尤其是前者,尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time APIInstant。您不需要显式格式化程序:OffsetDateTime.parse(dateString) 适用于两个示例字符串。
  • -08:00Z 都是 UTC 偏移量。 Z 表示 UTC(零偏移量或“Zulu”)。所以这两个字符串实际上是相同的格式。它是国际标准 ISO 8601 格式。
  • @shmosel 不,不是ZonedDateTime,你可以通过它,但它具有误导性,因为输入中只有一个与UTC(小时-分钟-秒)的偏移量,而不是时区 (Continent/Region)。最好是OffsetDateTime.parse( "2019-03-01T22:22:50.591-08:00" )

标签: java timezone simpledateformat


【解决方案1】:

这可能就是您要查找的内容:"yyyy-MM-dd'T'HH:mm:ss.SSSXXX"

Date parsed1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.US).parse("2019-03-01T22:22:50.591Z");
System.out.println(parsed1); // Fri Mar 01 16:22:50 CST 2019

Date parsed2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.US).parse("2019-03-01T22:22:50.591-08:00");
System.out.println(parsed2); // Sat Mar 02 00:22:50 CST 2019

正如 Basil 在下面指出的,如果您运行的是 Java 8+ 或 JSR 310 的反向移植,这些也可以工作:

    OffsetDateTime parsed1 = OffsetDateTime.parse("2019-03-01T22:22:50.591Z");
    System.out.println(parsed1); // Fri Mar 01 16:22:50 CST 2019

    OffsetDateTime parsed2 = OffsetDateTime.parse("2019-03-01T22:22:50.591-08:00");
    System.out.println(parsed2); // Sat Mar 02 00:22:50 CST 2019

【讨论】:

  • 是的,同意,但不想同时转动太多螺丝。我有两个客户端仍在生产环境中运行 JBoss EAP 4.2,并且不会使用 JSR 310 反向移植...已编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 2011-09-28
相关资源
最近更新 更多