将字符串时间戳转换为符合 ISO 8601 的字符串

convert string timestamp to ISO 8601 compliant string

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

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

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

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

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

您可以在示例部分找到更多示例:- 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);

较新的 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 不存在?我知道在这种情况下,您需要 Z 的 UTC 偏移量。例如像这样:

    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(下方 link)。它为 Java 6 和 7 提供了 类 的大部分。我不太乐意告诉你你需要一个外部库,但在这种情况下,直到你移动到 Java 8. 希望你快点。

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

Link: ThreeTen Backport