用于UTC的Java DateFormat

时间:2017-02-28 17:45:23

标签: java simpledateformat timezone-offset

我有一个类似

的DateFormat
DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");

我有这样的约会:

2017-02-23T11:00:04.072625

此“日期”是UTC日期(Z为空)。这解析得很好。但是,它似乎被解释为机器的时区。所以,我的机器是EST,最终是

2017-02-23T11:00:04.072625-0500

哪个错了。我可以用

显式设置时区
format.setTimeZone(TimeZone.getTimeZone("UTC"));

但如果未来的时间来自不同的区域,那也不是正确的。

如果我在SimpleDateFormat字符串中添加“Z”或“z”,则无法解析。

有关如何正确处理此问题的任何想法?

1 个答案:

答案 0 :(得分:1)

首先,由于您使用的是Java 8,因此首先要放弃旧类DateDateFormatSimpleDateFormatTimeZone。他们更有可能给你不想要的麻烦。而是使用Java 8中引入的java.time中的类。在这里:

    String yourDateTime = "2017-02-23T11:00:04.072625";

    LocalDateTime ldt = LocalDateTime.parse(yourDateTime);
    Instant i = ldt.atOffset(ZoneOffset.UTC).toInstant();

Instant是与旧Date最佳对应的新类。在这种情况下,你得到

2017-02-23T11:00:04.072625Z

Z表示UTC)

如果您将来在不同的时区获得日期,则可以执行类似

的操作
    ZoneId zi = ZoneId.of("Europe/Paris");
    Instant i = ldt.atZone(zi).toInstant();     

在这种情况下,你会得到

2017-02-23T10:00:04.072625Z

如果您出于某种原因需要旧式Date实例,例如与旧代码一起使用,则很容易:

    Date oldfashionedDate = Date.from(i);