LocalDate.parse()
使用or有一个微妙的错误问题new LocalDate()
。一个代码片段值一千字。在 scala repl 的以下示例中,我想以字符串格式 yyyyMMdd 获取本地日期。LocalDate.parse()
很高兴给我一个 LocalDate 的实例,但它不是正确的(new LocalDate()
具有相同的行为):
scala> org.joda.time.LocalDate.parse("20120202")
res3: org.joda.time.LocalDate = 20120202-01-01
我给它 2016 年 2 月 2 日,格式为 yyyyMMdd,我得到的日期是 20120202 年 1 月 1 日。我在这里很危险:我认为这不是它应该做的。Joda 使用 'yyyy-MM-dd' 作为默认值,但会隐含地接受没有 '-' 字符的字符串,认为你想要那年的 1 月 1 日?对我来说,这似乎不是一个合理的默认行为。
鉴于此,在我看来,使用不容易被愚弄的 joda 日期格式化程序是解析字符串的更好解决方案。此外,LocalDate.parse()
如果日期格式不是“yyyy-MM-dd”,则可能会引发异常:
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 年的日期要理智得多。