我有一个类似
的DateFormatDateFormat 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”,则无法解析。
有关如何正确处理此问题的任何想法?
答案 0 :(得分:1)
首先,由于您使用的是Java 8,因此首先要放弃旧类Date
,DateFormat
,SimpleDateFormat
和TimeZone
。他们更有可能给你不想要的麻烦。而是使用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);