Как получить первую дату и последнюю дату предыдущего месяца? (Ява)
С сегодняшней датой я должен получить первую дату и последнюю дату предыдущего месяца. Я не могу придумать какую-либо логику.
Например, при передаче 05/30/2012
я должен получить 04/01/2012
и 04/30/2012
.
Любая помощь будет высоко оценена. Спасибо.
Ответы
Ответ 1
С Calendar
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, -1);
cal.set(Calendar.DATE, 1);
Date firstDateOfPreviousMonth = cal.getTime();
cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DATE)); // changed calendar to cal
Date lastDateOfPreviousMonth = cal.getTime();
См
Ответ 2
ТЛ; др
YearMonth.now().minusMonths( 1 ).atDay( 1 )
…а также…
YearMonth.now().minusMonths( 1 ).atEndOfMonth()
Избегайте juDate
Избегайте связанных классов java.util.Date и.Calendar, поскольку они, как известно, хлопотны. Вместо этого используйте пакет java.time в Java 8 и более поздних версиях.
java.time
В новой структуре java.time в Java 8 (Tutorial) есть команды для этого.
YearMonth
названный класс YearMonth
представляет месяц месяца без какого-либо определенного дня или времени. Оттуда мы можем попросить первый и последний дни месяца.
ZonedId zoneId = ZoneId.of( "America/Montreal" );
YearMonth yearMonthNow = YearMonth.now( zoneId );
YearMonth yearMonthPrevious = yearMonthNow.minusMonths( 1 );
LocalDate firstOfMonth = yearMonthPrevious.atDay( 1 );
LocalDate lastOfMonth = yearMonthPrevious.atEndOfMonth();
Joda времени
UPDATE: проект Joda-Time теперь находится в режиме обслуживания, а команда советует перейти на классы java.time. См. Учебник от Oracle.
В Joda-Time 2.8 используйте класс LocalDate
если вас не волнует время суток.
LocalDate today = LocalDate.now( DateTimeZone.forID( "Europe/Paris" ) );
LocalDate firstOfThisMonth = today.withDayOfMonth( 1 );
LocalDate firstOfLastMonth = firstOfThisMonth.minusMonths( 1 );
LocalDate endOfLastMonth = firstOfThisMonth.minusDays( 1 );
О java.time
Рамка java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют неприятные старые устаревшие классы времени, такие как java.util.Date
, Calendar
и SimpleDateFormat
.
Проект Joda-Time, теперь в режиме обслуживания, советует перейти на классы java.time.
Чтобы узнать больше, ознакомьтесь с учебным пособием Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация - JSR 310.
Вы можете обменивать объекты java.time непосредственно с вашей базой данных. Используйте JDBC-драйвер, совместимый с JDBC 4.2 или новее. Нет необходимости в строках, нет необходимости в java.sql.*
.
Где можно получить классы java.time?
Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval
, YearWeek
, YearQuarter
и другие.
Ответ 3
Используйте JodaTime
DateMidnight now = new DateMidnight();
DateMidnight beginningOfLastMonth = now.minusMonths(1).withDayOfMonth(1);
DateMidnight endOfLastMonth = now.withDayOfMonth(1).minusDays(1);
System.out.println(beginningOfLastMonth);
System.out.println(endOfLastMonth);
Вывод:
2012-04-01T00: 00: 00,000 + 02: 00
2012-04-30T00: 00: 00,000 + 02: 00
Объяснение: объект DateMidnight является объектом Date без информации о времени суток, которая кажется вам именно такой, какой вам нужно. Если нет, замените все вхождения DateMidnight на DateTime в приведенном выше коде.
Ответ 4
ну, вы можете создать объект календаря, установить дату в первый день текущего месяца (должен быть первым: P), а затем вы можете выполнить две операции:
из вашего объекта календаря вы можете вычесть определенный период времени, например. месяц (это дало бы вам первую дату предыдущего месяца или день, который даст вам последний день предыдущего месяца. Я не пробовал, но это были бы мои первые шаги.
Ответ 5
Также хотел бы добавить что-то к ответу Джигара. Используйте класс DateFormat
, чтобы получить дату в формате, указанном в вопросе:
DateFormat df = DateFormat.getInstance(DateFormat.SHORT);
System.out.println(df.format(firstDateOfPreviousMonth));
System.out.println(df.format(lastDateOfPreviousMonth));
Вывод:
04/01/12
04/30/12
Ответ 6
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DATE, 1);
cal.add(Calendar.DAY_OF_MONTH, -1);
Date lastDateOfPreviousMonth = cal.getTime();
cal.set(Calendar.DATE, 1);
Date firstDateOfPreviousMonth = cal.getTime();