Преобразование формата даты Java - неправильный месяц - PullRequest
8 голосов
/ 07 января 2012

У меня проблема с преобразованием даты в Java, не знаю, где я ошибаюсь ...

    String dateStr = "2011-12-15";
    String fromFormat = "yyyy-mm-dd";
    String toFormat = "dd MMMM yyyy";

    try {
        DateFormat fromFormatter = new SimpleDateFormat(fromFormat);
        Date date = (Date) fromFormatter.parse(dateStr);

        DateFormat toformatter = new SimpleDateFormat(toFormat);
        String result = toformatter.format(date);

    } catch (ParseException e) {
        e.printStackTrace();
    }

Дата ввода - 2011-12-15, и я ожидаю результат как«15 декабря 2011», но я получаю это как «15 января 2011»

где я ошибаюсь?

Ответы [ 8 ]

29 голосов
/ 07 января 2012

Ваш fromFormat использует минуты, где он должен использовать месяцы.

String fromFormat = "yyyy-MM-dd";
5 голосов
/ 07 января 2012

Я думаю, из формата должно быть "гггг-ММ-дд".

Вот формат:

  • м == Минута в час
  • M == Месяц в году

Подробнее: http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

2 голосов
/ 07 января 2012

Из формата должно быть:

String fromFormat = "yyyy-MM-dd"
2 голосов
/ 07 января 2012
 String fromFormat = "yyyy-MM-dd"; 
2 голосов
/ 07 января 2012

Посмотрите на javadoc SimpleDateFormat и посмотрите, что означает m. Не месяцы, как ты думаешь, а минуты.

1 голос
/ 24 января 2017

tl; др

LocalDate.parse( "2011-12-15" )                            // Date-only, without time-of-day, without time zone.
.format(                                                   // Generate `String` representing value of this `LocalDate`. 
    DateTimeFormatter.ofLocalizedDate( FormatStyle.LONG )  // How long or abbreviated?
                     .withLocale(                          // Locale used in localizing the string being generated.
                         new Locale( "en" , "IN" )         // English language, India cultural norms.
                     )                                     // Returns a `DateTimeFormatter` object.
)                                                          // Returns a `String` object.

15 декабря 2011

java.time

В то время как принял ответ правильно (в верхнем регистре MM для месяца), теперь есть лучший подход.Утомительные старые классы даты и времени теперь унаследованы и заменены классами java.time.

Ваша входная строка имеет стандартный формат ISO 8601 .Поэтому нет необходимости указывать шаблон форматирования для разбора.

LocalDate ld = LocalDate.parse( "2011-12-15" );  // Parses standard ISO 8601 format by default.
Locale l = new Locale( "en" , "IN" ) ;  // English in India.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.LONG )
                                       .withLocale( l );
String output = ld.format( f );

Дамп в консоль.

System.out.println( "ld.toString(): " + ld );
System.out.println( "output: " + output );

ld.toString (): 2011-12-15

вывод: 15 декабря 2011

См. живой код в IdeOne.com .


О java.time

Платформа java.time встроена в Java 8 и более поздние версии.Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Вы можете обмениваться java.time объектами непосредственно с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10, а позже
    • Встроенный.
    • Часть стандартного Java API с встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функций java.time перенесена на Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии реализации комплекта Android-классов java.time.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

1 голос
/ 07 января 2012

m в SimpleDateFormat обозначает минуты, а M обозначает месяц.Таким образом, ваш первый формат должен быть yyyy-MM-dd.

0 голосов
/ 21 мая 2018

Ну, это может быть не ваш случай, но может помочь кому-то.В моем случае после конвертации день месяца и месяц устанавливаются на 1. Итак, какой бы ни была дата, после конвертации я получаю 1 янв, что неправильно.После борьбы я обнаружил, что в формате даты я использовал YYYY вместо yyyy.Когда я изменил все заглавные буквы Y на y, все заработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...