2012-05-31 8 views
14

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

Например, при прохождении 05/30/2012, я должен получить 04/01/2012 и 04/30/2012.

Любая помощь будет очень признательна. Благодарю.

ответ

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 в приведенном выше коде.

+0

+1 и OP также хочет иметь последнюю дату предыдущего месяца –

+0

классы полуночи и методы по Joda-времени устарели. Используйте метод 'withTimeAtStartOfDay'. –

+1

FYI, проект [Joda-Time] (http://www.joda.org/joda-time/) теперь находится в [режиме обслуживания] (https://en.wikipedia.org/wiki/Maintenance_mode), с команда, предлагающая перейти на классы [java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html). См. [Учебное пособие по Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

2

ну, вы можете создать объект календаря, установить дату в первый день текущего месяца (должен быть первым: P), а затем вы можете выполнить две операции: из вашего объекта календаря вы можете вычесть определенный период времени, например в месяц (это дало бы вам первую дату предыдущего месяца или день, который даст вам последний день предыдущего месяца. Я не пробовал, но это были бы мои первые шаги.

26

С 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(); 

См

+1

Почему это не принятый ответ? –

+0

Нужно ли нам когда-либо использовать 'getActualMinimum'? Или просто предположите, что это всегда 1? – ADTC

+0

для Date вы можете считать его равным 1 для григорианского календаря, но есть еще несколько полей, [проверьте это] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk /openjdk/8u40-b25/java/util/GregorianCalendar.java#GregorianCalendar.0MIN_VALUES –

1

Также хотел бы добавить что-то к ответу Джигара. Используйте 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 
+0

Спасибо, Шон .... –

+0

вы можете принять этот. – Mdhar9e

5

Т.Л., д-р

YearMonth.now().minusMonths(1).atDay(1) 

... и ...

YearMonth.now().minusMonths(1).atEndOfMonth() 

Избегайте juDate

Избегайте связанных классов java.util.Date и .Calendar, поскольку они, как известно, являются хлопотными. Вместо этого используйте java.time package в Java 8 и более поздних версиях.

java.time

Новый java.time framework в Java 8 (Tutorial) есть команды для этого.

Класс aptly-name 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 теперь в maintenance mode с командой советуя миграции в java.time классов. См. Tutorial by 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); 
+0

Смотрите мой [аналогичный answe r] (http://stackoverflow.com/a/26321291/642706), чтобы дублировать вопрос для более подробного обсуждения этого типа кода. –

0
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(); 
Смежные вопросы