我同意乔C和路易斯瓦塞尔曼点评:留了早已过时的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
。正如另外两个答案所说,这正是格式模式与输入不匹配的地方。相信我的话,这只是一个例子,你可以从现代课程中获得更好的帮助,而不是从旧课程中获得更多帮助。
我不能更强烈地建议不要使用传统的'java.util.Date'类。您应该改用'java.time'包中的相应类。 –
您可以打印正在捕获的异常的堆栈跟踪,然后在此处发布输出? – csmckelvey
您应该考虑不推荐使用java.util.Date。整个东西。 –