Месяц не печатается с даты - 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