我有一段代码长这样:
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()
会返回上述格式的字符串。再次说明,这段代码大部分时间都能正常工作,但是有几次却不能,我对此感到困惑。我考虑过是不是因为结尾有个零而没有显示出来,但我并不确定,因为我可以通过调用 Instant.now().toString() 获得一个值为 2018-05-25T20:06:58.900Z 的结果。
Date d = new Date(Instant.now().toEpochMilli());
呢? - Thomas KlägerInstant.toString()
只在必要时(如果它们不是000
)输出毫秒数的数字。因此,您有千分之一的机会恰好在秒数上(所有毫秒数字都为零)遇到代码失败的情况。 - Thomas Klägerjava.time
,因此不要再使用过时且设计不佳的Date
。只有在需要为无法更改的旧版API使用Date
时,才应使用Date.from(Instant)
进行转换。并且在任何情况下都不要使用臭名昭著的问题多多的SimpleDateFormat
。 - Ole V.V.Instant.now().toString()
会产生类似于2018-05-26T05:56:50.294304Z
的输出,而你的代码将其转换为了Date
类型,显示为Sat May 26 08:01:44 CEST 2018
。CEST偏移量为+02:00,因此你会发现时间不正确。 - Ole V.V.