Время Joda: Как преобразовать строку в LocalDate? - PullRequest
44 голосов
/ 27 апреля 2010

Как указать строку формата для преобразования только одной даты из строки. В моем случае важна только часть даты

Сформировать его как DateTime не удалось:

String dateString = "2009-04-17";
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd");
DateTime dateTime = formatter.parseDateTime(dateString);

с ошибкой java.lang.IllegalArgumentException: Invalid format: "2011-04-17" is too short

Возможно, потому что я должен использовать LocalDate вместо этого. Но я не вижу никакого форматера для LocalDate. Как лучше всего преобразовать String dateString = "2009-04-17"; в LocalDate (или что-то еще, если это неправильное представление)

спасибо ...

Ответы [ 6 ]

52 голосов
/ 27 апреля 2010

Вы, вероятно, ищете LocalDate(Object). Это немного сбивает с толку, так как требуется общий Object, но документы указывают, что он будет использовать ConverterManager, который знает, как обрабатывать String, если вы передаете String в конструктор например,

LocalDate myDate = new LocalDate("2010-04-28");
19 голосов
/ 22 августа 2013

Используйте метод parse(String).

LocalDate date = LocalDate.parse("2009-04-17");
9 голосов
/ 12 февраля 2016

При использовании 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.

4 голосов
/ 12 февраля 2016

В моем случае входящая строка может быть в одном из двух форматов. Поэтому я сначала пытаюсь разобрать строку с более конкретным форматом:

String s = "2016-02-12";
LocalDateTime ldt;
try {
    ldt = LocalDateTime.parse(s, DateTimeFormat.forPattern("YYYY-MM-dd HH:mm"));
}
catch (IllegalArgumentException e) {
    ldt = LocalDateTime.parse(s, DateTimeFormat.forPattern("YYYY-MM-dd"));
}
1 голос
/ 07 декабря 2015

Вы можете использовать LocalDate.of с указанием года, месяца и дня в качестве отдельных аргументов:

LocalDate date1 = LocalDate.of(2009, 4, 17);
LocalDate date2 = LocalDate.of(2009, Month.APRIL, 17);
1 голос
/ 13 июля 2014

Это сработало для меня:

LocalDate d1 = LocalDate.parse("2014-07-19");
LocalDate dNow = LocalDate.now();  // Current date
...