【发布时间】:2018-11-05 06:06:48
【问题描述】:
我的代码如下所示:
String PROPER_DATE_FORMAT = "yyyy-MM-dd";
String format = "yyyy-MM-dd'T'HH:mm:ss.SSSX";
SimpleDateFormat sdf = new SimpleDateFormat(format);
Date d = sdf.parse(Instant.now().toString());
SimpleDateFormat properFormat = new SimpleDateFormat(PROPER_DATE_FORMAT);
String formatterDate = properFormat.format(d);
现在,大多数情况下,这段代码都能正常工作,但我会时不时地使用 Instant.now() 返回 2018-05-25T18:56:09Z,然后它会在格式不匹配的情况下抛出异常。
为什么有时会不一致?
例外是java.lang.RuntimeException: java.text.ParseException: Unparseable date: "2018-05-25T18:56:09Z"
通常,当Instant.now().toString() 确实返回具有上述格式的字符串时。同样,这段代码大部分时间都有效,但也有几次无效,我不知道为什么。
我想是否是因为最后有一个零但没有显示但我不相信因为我能够得到一个值 2018-05-25T20:06:58.900Z 结果Instant.now().toString()
【问题讨论】:
-
谢谢,我已经包含了异常情况
-
为什么要将瞬间转换为字符串只是为了将其解析为日期?为什么不写
Date d = new Date(Instant.now().toEpochMilli()); -
Instant.toString()仅在必要时输出millis 的数字(如果它们不是000)。因此,您有千分之一的机会准确地击中您的代码将失败的秒(所有毫秒数字为零) -
既然你可以使用
java.time,现代Java 日期和时间API,也不要使用Date,它已经过时并且设计很差。仅当您需要Date用于无法更改的旧版 API 时。仅在这种情况下,使用Date.from(Instant)进行转换。并且在任何情况下完全使用臭名昭著的麻烦SimpleDateFormat。 -
顺便说一句,在我计算机上的 Java 9 上,
Instant.now().toString()产生类似2018-05-26T05:56:50.294304Z的东西,您的代码会将其转换为 2018 年 5 月 26 日星期六 08:01:44 CEST 的Date. CEST 位于偏移 +02:00,因此您注意到时间不正确。
标签: java java-8 java-time date