【问题标题】:convert string timestamp to ISO 8601 compliant string将字符串时间戳转换为符合 ISO 8601 的字符串
【发布时间】:2017-04-29 17:17:56
【问题描述】:

我有一个字符串格式的时间戳和偏移量,如下所示的两个不同的变量:

01/14/2016 07:37:36PM
-08:00

我想将上面的时间戳转换成ISO 8601 compliant String, with milliseconds and timezone,所以转换后应该是这样的:

2016-01-14T19:37:36-08:00

我该怎么做?我正在使用 jodatime 库。

【问题讨论】:

  • SimpleDateFormat
  • 您认为您可以从哪里获得毫秒数?它们甚至不在您想要的 ISO-8601 字符串中。
  • -08:00 是与 UTC 的偏移量,不是时区。时区是区域偏移量更改的历史记录。例如:America/MontrealAsia/Kolkata
  • Joda-Time 项目现在处于维护模式。它的团队建议转移到 java.time 类。

标签: java date jodatime iso8601


【解决方案1】:

较新的 java.time 类与 ISO 8601 字符串配合得非常好。

    String dateTimeString = "01/14/2016 07:37:36PM"; 
    String offsetString = "-08:00";

    LocalDateTime dateTime = LocalDateTime.parse(dateTimeString,
            DateTimeFormatter.ofPattern("MM/dd/uuuu hh:mm:ssa"));
    ZoneOffset offset = ZoneOffset.of(offsetString);
    String formattedTimestamp = dateTime.atOffset(offset).toString();
    System.out.println(formattedTimestamp);

打印出来

2016-01-14T19:37:36-08:00

远离过时的课程,例如 SimpleDateFormat

什么是offsetString 不存在?我知道在这种情况下,您希望 UTC 偏移 Z。比如这样:

    ZoneOffset offset;
    if (offsetString == null) {
        offset = ZoneOffset.UTC;
    } else {
        offset = ZoneOffset.of(offsetString);
    }
    String formattedTimestamp = dateTime.atOffset(offset).toString();

有了null offsetString,我们现在得到

2016-01-14T19:37:36Z

java.time 中的类(我只使用其中的几个)在 JSR-310 中进行了描述,并且内置于 Java 8 中。如果您想在 Java 6 或 7 中使用它们怎么办?你得到了 ThreeTen Backport(下面的链接)。它为您提供了 Java 6 和 7 的大部分类。我不太高兴告诉您您需要一个外部库,但在这种情况下,它只是在您迁移到 Java 8 之前。我希望您很快就会这样做。

我相信 JodaTime 也可以做到,但我没有这方面的经验,所以不能在那里给你详细信息。我所知道的,我已经阅读了 JodaTime 背后的人,现在建议你改用 java.time。因此,我要求您将一个外部库换成一个更新的(据说更好)的库。就其本身而言,我对此并不不满。仅当您已经有一个使用 JodaTime 的代码库时,这才不是微不足道的。

链接:ThreeTen Backport

【讨论】:

  • 没有Java 8有什么方法可以使用吗?
  • 我只有 ZoneId 有问题,因为我无法定位。
  • 如果 offsetString 不存在会发生什么?在那种情况下,我只想返回这个2016-01-14T21:16:54Z 而没有任何偏移。这是另一个不存在偏移量的示例。
  • 在 ISO-8601 中,Z 算作(零)偏移量(来自 UTC)。我已经编辑了答案以显示我们如何处理它(我还稍微简化了原始代码)。 @user1950349
  • 关于你的最后一段……添加 ThreeTen-Backport 不需要删除 Joda-Time。两个库都可以存在于一个项目中。请注意 import 语句,因为两个库中可能都存在一些类名。
【解决方案2】:

您可以在示例部分找到更多示例:- http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
String string2 = "2001-07-04T12:08:56.235-07:00";
Date result2 = df2.parse(string2);

【讨论】:

  • 我将如何在我的示例中执行此操作?
猜你喜欢
  • 2011-01-13
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 2021-01-11
  • 2017-07-25
  • 1970-01-01
相关资源
最近更新 更多