При использовании LocalDate.parse()
или 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
Я даю это 2 февраля 2016 года в формате yyyyMMdd и возвращаю дату 1 января 20120202. Я выхожу на конечность: я не думаю, что это то, что он должен делать. Joda использует 'yyyy-MM-dd' по умолчанию, но неявно примет строку без символов '-', думая, что вы хотите 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.