Jon Skeet’s answer是正确的,是当它被写在2013年
但是一个很好的答案,你在你的问题,SimpleDateFormat
和Date
使用类,现在早已过时,因此,如果有人得到了类似的问题与他们今天,恕我直言,最好的答案是改为使用the modern Java date & time API。
很抱歉,我无法编写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
类,这个类代表没有时间的日期,正是我们在这里需要的。
- 通过
"03/88/2013 hjhkjhk"
给出DateTimeParseException
与消息Text '03/88/2013 hjhkjhk' could not be parsed, unparsed text found at index 10
。很精确,不是吗?尽管如此,现代API只有解析字符串的一部分的方法。
"03/88/201309"
给出Text '03/88/201309' could not be parsed at index 6
。我们问了一个4位数的年份,并给了它6位数字,这导致了反对意见。显然它会在尝试将88解释为一个月中的某一天之前检测并报告此错误。
- 虽然:
"03/88/2013"
给出了Text '03/88/2013' could not be parsed: Invalid value for DayOfMonth (valid values 1 - 28/31): 88
,但它反对到88的月份。再次,请欣赏信息的信息量。
"03-08-2013"
(用连字符代替斜线)给出Text '03-08-2013' could not be parsed at index 2
,这并不令人惊讶。索引2是第一个连字符的位置。
Jon Skeet解释说,过时的SimpleDateFormat
可以是宽松的或非宽松的。对于DateTimeFormatter
也是如此,事实上它有3个而不是2个解析器样式,称为'宽松','聪明'和'严格'。因为很多程序员都没有意识到这一点,但我认为他们做出了一个不放宽'默认'('聪明')的好选择。
如果我们想让我们的格式化程序变得宽容呢?
private static DateTimeFormatter parseFormatter
= DateTimeFormatter.ofPattern("MM/dd/yyyy")
.withResolverStyle(ResolverStyle.LENIENT);
现在还解析"03/88/2013"
,为2013-05-27
。我相信这是老班级也会这样做的:从3月初计算88天,计算5月27日。其他错误消息仍然相同。换句话说,它仍然反对未解析的文本,6位数的年份和连字符。
问题:我可以在我的Java版本中使用现代API吗?
如果至少使用Java ,您可以。
'var date'?我不这么认为,请将您的真实代码复制到问题中。 – Perception 2013-03-11 10:26:35
'var date'不是Java。 – 2013-03-11 10:26:42
@Lutz Horn。我正在使用scala – Rishi 2013-03-11 10:51:37