Подтвердить что ты не робот

Время Джоды: как преобразовать String в LocalDate?

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

Построить его как 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 (или что-то еще, если это неверное представление)

спасибо...

4b9b3361

Ответ 1

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

LocalDate myDate = new LocalDate("2010-04-28");

Ответ 2

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

LocalDate date = LocalDate.parse("2009-04-17");

Ответ 3

Там несколько тонкая ошибка с использованием 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 января 2012 года02. Я выхожу на конечность здесь: я не думаю, что это то, что он должен делать. 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 = [email protected]

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 = [email protected]

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

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

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"));
}

Ответ 5

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

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

Ответ 6

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

LocalDate date1 = LocalDate.of(2009, 4, 17);
LocalDate date2 = LocalDate.of(2009, Month.APRIL, 17);