Месяц не печатается с даты - Java DateFormat

Как получить месяц с даты в java:

        DateFormat inputDF  = new SimpleDateFormat("mm/dd/yy");
        Date date1 = inputDF.parse("9/30/11");

        Calendar cal = Calendar.getInstance();
        cal.setTime(date1);

        int month = cal.get(Calendar.MONTH);
        int day = cal.get(Calendar.DAY_OF_MONTH);
        int year = cal.get(Calendar.YEAR);

        System.out.println(month+" - "+day+" - "+year);

Этот код возвращает день и год, но не месяц.

вывод:

0 - 30 - 2011

Ответ 1

Это связано с тем, что ваш формат неверен: вам нужен "MM/dd/yy" за месяц, потому что "mm" находится в минутах:

DateFormat inputDF  = new SimpleDateFormat("MM/dd/yy");
Date date1 = inputDF.parse("9/30/11");

Calendar cal = Calendar.getInstance();
cal.setTime(date1);

int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
int year = cal.get(Calendar.YEAR);

System.out.println(month+" - "+day+" - "+year);

Печать 8 - 30 - 2011 (поскольку месяцы основаны на нулевом значении; демонстрация)

Ответ 2

Сначала вы использовали mm в вашем формате даты, который является "минутами" в соответствии с Javadocs. Вы устанавливаете минуты на 9, а не на месяц. Похоже, что месяц по умолчанию равен 0 (январь).

Используйте mm (capital 'M's) для анализа месяца. Затем вы увидите 8, потому что в Calendar месяца начинаются с 0, а не 1. Добавьте 1, чтобы вернуть желаемый 9.

Первый месяц года в григорианском и юлианском календарях ЯНУАР, который равен 0

// MM is month, mm is minutes
DateFormat inputDF  = new SimpleDateFormat("MM/dd/yy");  

и позже

int month = cal.get(Calendar.MONTH) + 1; // To shift range from 0-11 to 1-12

Ответ 3

Если вы прочитали SimpleDateFormat javadoc, вы заметите, что mm находится в минутах. Вам нужно mm за месяц.

DateFormat inputDF  = new SimpleDateFormat("MM/dd/yy");

В противном случае формат не читает поле month и принимает значение 0.

Ответ 4

Формат месяца должен быть MM вместо MM

 DateFormat inputDF  = new SimpleDateFormat("MM/dd/yy");

Ответ 5

Время для того, чтобы кто-то предоставил современный ответ. Другие ответы были хорошими ответами, когда вопрос был задан в 2013 году и по-прежнему верны. Сегодня нет причин, по которым вам следует бороться со старым, устаревшим и одновременно заведомо неудобным классом SimpleDateFormat. java.time, современный API дат и времени Java, гораздо приятнее работать с:

    DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("M/d/yy");
    LocalDate date1 = LocalDate.parse("9/30/11", inputFormatter);
    System.out.println(date1);

Отпечатает

2011-09-30

Класс LocalDate представляет дату без времени суток, именно то, что вам нужно, оно соответствует вашему требованию гораздо точнее, чем старые классы Date и Calendar.

Строки шаблонов формата, используемые с DateTimeFormatter, напоминают те, что указаны в SimpleDateFormat, есть несколько отличий. Вы можете использовать прописную букву MM, чтобы потребовать двухзначный месяц (например, 09 сентября) или один M, чтобы месяц был написан с одной или двумя цифрами. Аналогично dd или d за день месяца. yy обозначает двузначный год и интерпретируется с базой 2000, то есть с 2000 до 2099 включительно (не будет работать для моего дня рождения).

Ссылка: Учебник Oracle Трейл: время по времени, объясняющее, как использовать java.time.

Ответ 6

Попробуйте использовать это с помощью MM вместо MM: -

    DateFormat inputDF  = new SimpleDateFormat("MM/dd/yy");
    Date date1 = inputDF.parse("9/30/11");

    Calendar cal = Calendar.getInstance();
    cal.setTime(date1);

    int month = cal.get(Calendar.MONTH);
    int day = cal.get(Calendar.DAY_OF_MONTH);
    int year = cal.get(Calendar.YEAR);

    System.out.println(month+" - "+day+" - "+year);

Отпечатанный месяц будет 8, так как индекс начинается с 0

или попробуйте: -

int month = cal.get(Calendar.MONTH) + 1;

Ответ 7

mm используется для минут, используйте mm при указании формата.

Calendar cal = Calendar.getInstance();
cal.setTime(date1);

int month = cal.get(Calendar.MONTH);// returns month value index starts from 0