Jon Skeet的答案是正确的,在2013年写成时是一个很好的答案。
但是,您在问题中使用的类和现在早已过时,因此,如果有人今天遇到类似的问题,恕我直言,最好的答案是更改为使用现代Java日期和时间API。SimpleDateFormat
Date
很抱歉,我不能写Scala代码,所以你必须忍受Java。我正在使用
private static DateTimeFormatter parseFormatter
= DateTimeFormatter.ofPattern("MM/dd/yyyy");
格式模式字母与您的问题中相同,但含义略有不同。 从字面上理解图案字母的数量,正如我们将看到的。现在我们尝试:DateTimeFormatter
System.out.println(LocalDate.parse(date, parseFormatter));
结果:
-
"03/11/2013"
按预期解析为。我使用了现代类,一个表示没有时间的日期的类,正是我们在这里需要的。2013-03-11
LocalDate
- 传递给出带有消息的 。非常精确,不是吗?不过,现代API有方法可以只解析字符串的一部分,如果这是我们想要的。
"03/88/2013 hjhkjhk"
DateTimeParseException
Text '03/88/2013 hjhkjhk' could not be parsed, unparsed text found at index 10
-
"03/88/201309"
给。我们要求一个4位数的年份,并给了它6位数,这导致了反对意见。显然,在尝试将88解释为月份的某一天之前,它会检测到并报告此错误。Text '03/88/201309' could not be parsed at index 6
- 不过,它也反对每月88的某一天:给出.再次,请享受消息的信息量。
"03/88/2013"
Text '03/88/2013' could not be parsed: Invalid value for DayOfMonth (valid values 1 - 28/31): 88
-
"03-08-2013"
(用连字符代替斜杠)给出,不是很令人惊讶。索引 2 是第一个连字符所在的位置。Text '03-08-2013' could not be parsed at index 2
Jon Skeet解释说,过时的可以宽大或宽松。这也是正确的,事实上它有3种而不是2种旋转变压器样式,称为“宽松”,“智能”和“严格”。但是,由于许多程序员没有意识到这一点,我认为他们做出了一个很好的选择,不让“宽松”成为默认值(“聪明”是)。SimpleDateFormat
DateTimeFormatter
如果我们想让格式化程序宽松呢?
private static DateTimeFormatter parseFormatter
= DateTimeFormatter.ofPattern("MM/dd/yyyy")
.withResolverStyle(ResolverStyle.LENIENT);
现在它还将 解析为 .我相信这是老班级也会做的:从3月初算起88天,得出5月27日。其他错误消息仍然相同。换句话说,它仍然反对未解析的文本,6位数字的年份和连字符。"03/88/2013"
2013-05-27
问:我可以在 Java 版本中使用现代 API 吗?
如果至少使用Java 6,则可以。