2012-05-31 53 views

回答

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對象沒有一天的信息,這似乎是你需要的東西的時間。如果不是,則用上面的代碼中的DateTime替換所有出現的DateMidnight。

+0

+1和OP也希望有比上月 –

+0

上喬達時間午夜的類和方法已被棄用的最後日期。使用'withTimeAtStartOfDay'方法。 –

+1

僅供參考,[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

對於日期,您可以假定它是公曆1的日期,但也有多個其他字段,[請查看此內容](http://grepcode.com/file/repository.grepcode.com/java/root/jdk /openjdk/8u40-b25/java/util/GregorianCalendar.java#GregorianCalendar.0MIN_VALUES –

1

還想添加一些東西給Jigar的答案。使用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

TL;博士

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

...和...

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

避免juDate

避免捆綁java.util.Date和.Calendar類,因爲它們是出了名的麻煩。請在Java 8及更高版本中使用java.time package

java.time

在Java中8所述的新java.time frameworkTutorial)具有用於此命令。

恰當地命名的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(); 

喬達時間

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

看到我的[similar 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(); 
相關問題