Как получить первую дату и последнюю дату предыдущего месяца? (Ява)

С сегодняшней датой я должен получить первую дату и последнюю дату предыдущего месяца. Я не могу придумать какую-либо логику.

Например, при передаче 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?

  • 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), то ThreeTenABP проект адаптирует ThreeTen-Backport (упоминалось выше). См. Раздел Как использовать ThreeTenABP....

Проект 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();