2017-02-28 71 views
-2

我有一个像Java的日期格式为UTC

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

一个日期格式我有一个日期是这样的:

2017-02-23T11:00:04.072625 

这 “日期” 是一个UTC日期(Z为空)。这解析得很好。但是,它似乎被解释为机器的时区。所以,我的机器是美国东部时间,这结束为

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

这是错误的。我可以明确地设置时区与像

format.setTimeZone(TimeZone.getTimeZone("UTC")); 

但如果时间来到了一个不同的区域在未来,这不会是正确的要么。

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

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

+1

您是否正在使用Java 8? –

+0

如果您设置时区,它将采用该值,否则默认情况下会占用您的机器时区。你有两种选择,你在找什么? –

+1

Markus,是Java 8 – MichaelB

回答

1

首先,由于您使用的是Java 8,通过丢弃老班DateDateFormatSimpleDateFormatTimeZone开始。他们更有可能不会给你不想要的麻烦。改用班java.time介绍了Java的8在这里你去:

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 

如果你由于某种原因需要一个oldfashioned Date实例,例如与旧代码一起使用,很容易:

Date oldfashionedDate = Date.from(i); 
+1

可能会更简单,只需将'Z'附加到输入字符串并直接解析为'Instant',即可跳过'LocalDateTime'步骤。 'Instant.parse(“2017-02-23T11:00:04。072625“+”Z“)'我并不是说它更好,只是一个选项。 –