我正在使用以下代码格式化毫秒分辨率的日期字符串。它适用于2018-09-14T13:05:21.329Z
,但不适用于2018-09-14T13:05:21.3Z
。有人可以提出原因以及如何纠正吗?
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
SimpleDateFormat sdfDestination = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
Date parsedDate = formatter.parse(date);
String destDate = sdfDestination.format(parsedDate);
return destDate;
} catch (java.text.ParseException parseException) {
logger.error("Parse Exception occured while converting publication time to date "
+ "format 'yyyy-MM-dd HH:mm:ss'", parseException);
}
我得到以下例外:
java.text.ParseException: Unparseable date: "2018-09-14T13:05:21.3Z"
at java.text.DateFormat.parse(Unknown Source) ~[na:1.8.0_181]
at com.noordpool.api.implementation.utility.Utility.parseDate(Utility.java:136) [classes/:na]
at com.noordpool.api.implementation.utility.Utility.parseMessage(Utility.java:77) [classes/:na]
答案 0 :(得分:1)
您唯一的问题是您为SimpleDateFormat
使用了错误的模式,需要进行以下更改:
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
收件人:
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
由于Z
字符串中使用的date
表示“零时偏移”,因此您只需在模式中将其作为'Z'
传递即可。
这是 a working demo ,具有正确的模式。
编辑:
要使事情适用于不同的语言环境和时区,在创建Locale
实例时需要使用适当的SimpleDateFormat
,代码应该是这样的:
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
答案 1 :(得分:1)
DateTimeFormatter dtfDestination
= DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
String date = "2018-09-14T13:05:21.3Z";
String destDate = Instant.parse(date)
.atZone(ZoneId.of("Indian/Comoro"))
.format(dtfDestination);
System.out.println(destDate);
此代码段的输出为:
2018-09-14 16:05:21
如果不是印度/科摩罗,请替换您的正确时区,因为正确的输出取决于使用正确的时区。如果要使用JVM的默认时区,请指定ZoneId.systemDefault()
,但要注意,可以随时从程序的其他部分或在同一JVM中运行的其他程序更改默认值。
我正在利用这样一个事实:您的字符串"2018-09-14T13:05:21.3Z"
采用ISO 8601格式,该格式是java.time类将其解析为默认值的格式,即没有任何显式格式化程序。 Instant.parse
接受秒中从0到9个小数的任何内容,因此像您一样,给它一个仅包含1个小数的字符串没有问题。相比之下,老式的SimpleDateFormat
不可能以秒为单位精确地解析秒上的十进制数,因为它将模式字母(大写)S
表示为毫秒,所以.3
将解析为3毫秒,而不是十分之三秒。
Jahnavi Paliwal已经正确诊断并解释了出现异常的原因。
您使用的日期时间类DateFormat
,SimpleDateFormat
和Date
早已过时,尤其是SimpleDateFormat
非常麻烦。由于您似乎正在使用Java 8(即使您没有使用Java 8),因此我建议您完全避免使用这些类,而改用java.time。
java.time
。