Проблема разбора Date-String (из-за месяцев от 0 до 11) - PullRequest
1 голос
/ 31 августа 2011

код

    String strDate = "2010-12-01";
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
    Date parsedDate = sdf.parse(strDate);
    System.out.println(parsedDate);

будет, в зависимости от вашей локали, производить следующий вывод:

Fri Jan 01 00:12:00 CET 2010

Дата не анализируется правильно, так как я ожидаю 1 декабря, а не 1 января. Я знаю, что месяцы пронумерованы от 0 до 11, поэтому в январе 12 становится 0.

Я имею в виду несколько решений этой проблемы, но все они произведут как минимум 3-4 дополнительные строки кода. Итак, мой вопрос:

Как лучше всего решить эту «проблему»?

Я не могу себе представить, что для анализа простой даты требуется более 2-3 строк ...

// edit: позор мне за этот вопрос. Прости меня. спасибо

Ответы [ 3 ]

9 голосов
/ 31 августа 2011

изменить yyyy-mm-dd на yyyy-MM-dd


M   Month in year   Month   July; Jul; 07  

m   Minute in hour  Number  30

См.

* * 1010 SimpleDateFormat
5 голосов
/ 31 августа 2011

Ваш формат даты неправильный: месяцы MM (не mm, что за минуты).Попробуйте это:

"yyyy-MM-dd"

Причина, по которой вы получаете январь, заключается в том, что вы не дали месяц анализатору (вы дали год-минута-день ).Январь, первый месяц, является месяцем по умолчанию, назначенным дате, если она не предоставлена ​​входными данными.12 разбирается в поле минут (довольно очевидно)

0 голосов
/ 14 августа 2016

Как лучше всего решить эту «проблему»?

Используйте разные классы. Вы используете проблемные старые унаследованные классы. Вместо этого используйте классы java.time.

LocalDate

Класс LocalDate представляет значение только для даты без времени суток и без часового пояса. Считает месяцы разумно, 1-12 с января по декабрь.

Ваша входная строка уже имеет один из форматов ISO 8601. Эти стандартные форматы используются по умолчанию в классах java.time. Так что нет необходимости определять шаблон форматирования.

LocalDate localDate = LocalDate.parse( "2010-12-01" );

Month

Также обратите внимание на перечисление Month.

Month month = Month.of( 1 ); // January = 1, December = 12.
...