使用LocalDate.parse()或new LocalDate()553存在一个有点微妙的bug-ish问题。一个代码段值得一千个单词。 在下面的示例中,我想以字符串格式yyyyMMdd获取本地日期。 LocalDate.parse()很高兴为我提供LocalDate的实例,但它不是正确的实例(new LocalDate()具有相同的行为):
scala> org.joda.time.LocalDate.parse("20120202")
res3: org.joda.time.LocalDate = 20120202-01-01
我以yyyyMMdd的格式给它提供了2016年2月2日,并且我回想起20120201年1月1日的日期。 Joda使用'yyyy-MM-dd'作为默认值,但隐含地接受不带'-'字符的字符串,以为您想要当年的1月1日? 在我看来,这似乎不是合理的默认行为。
鉴于此,在我看来,使用无法轻易上当的joda日期格式化程序是解析字符串的更好解决方案。 此外,如果日期格式不是'yyyy-MM-dd',则LocalDate.parse()应该可能引发异常:
scala> val format = org.joda.time.format.DateTimeFormat.forPattern("yyyyMMdd")
format: org.joda.time.format.DateTimeFormatter = org.joda.time.format.DateTimeFormatter@56826a75
scala> org.joda.time.LocalDate.parse("20120202", format)
res4: org.joda.time.LocalDate = 2012-02-02
这将导致其他格式失败,因此您不会遇到这种奇怪的越野车行为:
scala> val format = org.joda.time.format.DateTimeFormat.forPattern("yyyy-MM-dd")
format: org.joda.time.format.DateTimeFormatter = org.joda.time.format.DateTimeFormatter@781aff8b
scala> org.joda.time.LocalDate.parse("20120202", format)
java.lang.IllegalArgumentException: Invalid format: "20120202" is too short
at org.joda.time.format.DateTimeFormatter.parseLocalDateTime(DateTimeFormatter.java:900)
at org.joda.time.format.DateTimeFormatter.parseLocalDate(DateTimeFormatter.java:844)
at org.joda.time.LocalDate.parse(LocalDate.java:179)
... 65 elided
这比返回20120202年的日期更为理智。