【发布时间】:2019-02-11 16:49:48
【问题描述】:
这发生在一个(可能更多)日期时间,其中时间部分在解析中完全错误。
代码:
import java.text.*;
import java.util.*;
public class TestTimeParse {
public static void main(String[] args) {
SimpleDateFormat dateFmt = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.getDefault());
dateFmt.applyPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSS'Z'");
ParsePosition pos = new ParsePosition(0);
Date date = dateFmt.parse("2018-11-01T18:07:55.6725292Z", pos);
System.out.println("Text 2018-11-01T18:07:55.6725292Z parses as " + date);
}
}
输出:
文本 2018-11-01T18:07:55.6725292Z 解析为 Thu Nov 01 20:00:00 MDT 2018
时间组件发生了什么?小时是错误的,分钟和秒被清零。
【问题讨论】:
-
将模式更改为
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"并将输入更改为"2018-11-01T18:07:55.672Z"似乎可以解决问题。不确定这是否是与亚秒值相关的错误... -
如果我可以... 大多数时间,人们编写具有
yyyy-MM-dd'T'HH:mm:ss.SSSSSSS'Z'模式的日期格式解析器实际上是在尝试解析 ISO-8601 日期(时间)。并且使用这种基于字符串的固定时区不感知模式来解析 ISO 8601 日期是一个可怕的想法。因此,如果这确实是您想要做的,请查看stackoverflow.com/questions/2201925/… -
java.util.Date 只能处理毫秒。因此,SimpleDateFormat 对此唯一支持的模式是“yyyy-MM-dd'T'HH:mm:ss.SSS'Z'”,这意味着您的日期也必须用毫秒表示。
-
我建议你不要使用
DateFormat和Date。这些类设计不良且过时,尤其是前者,尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time API 的LocalDateTime和DateTimeFormatter。 -
@OleV.V.我同意。不幸的是,这是在 java 1.8 之前编写的代码,我们需要对其进行重构。但与此同时,我们需要使用它。
标签: java simpledateformat java-time