我已经实现了以下方法将String
转换为Date
,因为不推荐使用Date(String)
构造函数:
private Date format(String inputString) {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
try {
return dateFormat.parse(inputString);
} catch (ParseException e) {
return new Date();
}
}
一个inputString
样本为2017-06-01T01:00:00Z
。但是,当我检查输出时,我发现异常处理程序已被触发并返回new Date()
,这意味着我的模式出现了问题:"Jun 17, 2017 1:12:02 PM"
。
我对模式yyyy-MM-dd'T'HH:mm:ssZ
缺少什么?
答案 0 :(得分:4)
答案 1 :(得分:3)
我同意Joe C和Louis Wassermann的评论:如果有任何可能的话,请远离过时的Date
课程。而且有。现代的替代课程更加方便和程序员友好。
此外,您的输入字符串在瞬间即时间点符合ISO 8601标准,因此精确地符合Instant
类。不需要任何明确的格式化程序来解析它。我建议:
private static Instant parse(String inputString) {
try {
return Instant.parse(inputString);
} catch (DateTimeParseException dtpe) {
System.err.println("Parsing: " + dtpe);
return Instant.now();
}
}
使用如下方法,例如:
String inputString = "2017-06-01T01:00:00Z";
System.out.println(parse(inputString));
打印:
2017-06-01T01:00:00Z
嗯,这是你开始使用的相同字符串,因为Instant.toString()
会产生相同的ISO 8601字符串。
我也承认scottb:我们有时需要与需要旧式Date
实例的遗留代码进行互操作。如果是这种情况,请从Date.from(parse(inputString))
生成一个。这将产生等于瞬间的Date
(在我的计算机上打印为Thu Jun 01 03:00:00 CEST 2017
,因为这恰好是我的时区)。在任何情况下,我都建议您在输入遗留代码之前的最后一刻转换为Date
,以尽量减少您对其的使用。
只是为了实验,让我们尝试使用不正确的格式模式字符串和更新的DateTimeFormatter
类:
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ").parse(inputString);
这会产生java.time.format.DateTimeParseException: Text '2017-06-01T01:00:00Z' could not be parsed at index 19
。它试图对您有所帮助:2017-06-01T01:00:00Z
的索引19就是Z
所在的位置。正如另外两个答案所说,这正是格式模式与输入不匹配的地方。说实话,这只是很多例子中的一个例子,你可以从现代课程中获得更好的帮助,而不是从现代课程中获得更好的帮助。
答案 2 :(得分:1)
您的输入字符串中有一个文字Z
,因此您也需要引用它(或使用X
)。像,
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
或更好(正如评论中所指出的)
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
另外,不要抛弃异常(至少打印堆栈跟踪)。在Java 8+中,您应该使用新的java.time
类。这可能看起来像,
private static LocalDateTime format(String inputString) {
String pattern = "yyyy-MM-dd'T'HH:mm:ssX";
return LocalDateTime.from(DateTimeFormatter.ofPattern(pattern)
.parse(inputString));
}