2012-05-31 23 views

risposta

3

Usa 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); 

uscita:

2012-04-01T00: 00: 00.000 + 02: 00
2012-04-30T00: 00: 00.000 + 02: 00

Spiegazione: un oggetto DateMidnight è un oggetto Date senza informazioni sull'ora del giorno, che sembra proprio ciò di cui hai bisogno. In caso contrario, sostituire tutte le occorrenze di DateMidnight con DateTime nel codice precedente.

+0

+1 e OP vuole anche avere ultima data del mese precedente –

+0

Le classi mezzanotte e metodi su Joda-Time sono stati deprecati. Usa il metodo 'withTimeAtStartOfDay'. –

+1

FYI, il progetto [Joda-Time] (http://www.joda.org/joda-time/) è ora in [modalità manutenzione] (https://en.wikipedia.org/wiki/Maintenance_mode), con il team che consiglia la migrazione alle classi [java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html). Vedi [Tutorial di Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

2

bene è possibile creare un oggetto calendario, impostare la data sul primo giorno del mese corrente (dovrebbe essere la prima: P) e quindi è possibile eseguire due operazioni: dall'oggetto del calendario è possibile sottrarre un determinato periodo di tempo, ad es un mese (questo ti darebbe la prima data del mese precedente, o un giorno, che ti darebbe l'ultimo giorno del mese precedente.non l'ho provato ma questo sarebbe stato il mio primo passo

26

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

Vedi

+1

Perché questa non è la risposta accettata? –

+0

Abbiamo mai bisogno di usare 'getActualMinimum'? O supponi solo che sia sempre 1? – ADTC

+0

per Data si può supporre che sia 1 per il calendario gregoriano, ma ci sono anche più altri campi, [controllare questo] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk /openjdk/8u40-b25/java/util/GregorianCalendar.java#GregorianCalendar.0MIN_VALUES –

1

Vorrebbe anche aggiungere qualcosa alla risposta di Jigar. Utilizzare la classe DateFormat per ottenere la data nel formato specificato nella domanda:

DateFormat df = DateFormat.getInstance(DateFormat.SHORT); 
System.out.println(df.format(firstDateOfPreviousMonth)); 
System.out.println(df.format(lastDateOfPreviousMonth)); 

uscita:

04/01/12 
04/30/12 
+0

Grazie Sean .... –

+0

si può accettare questo – Mdhar9e

5

tl; dr

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

... e ...

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

Evitare juDate

Evitare le classi java.util.Date e .Calendar in bundle poiché sono notoriamente problematiche. Utilizzare invece lo java.time package in Java 8 e versioni successive.

java.time

La nuova java.time framework in Java 8 (Tutorial) ha i comandi per questo.

La classe con nome appropriato YearMonth rappresenta un mese di un anno, senza un giorno o un'ora specifici. Da lì possiamo chiedere il primo e l'ultimo giorno del mese.

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 Time

UPDATE: Il progetto Joda-Time è ora in maintenance mode, con il team di consulenza di migrazione alle java.time classi. Vedi Tutorial by Oracle.

In Joda-Time 2.8, utilizzare la classe LocalDate se non si cura dell'ora.

LocalDate today = LocalDate.now(DateTimeZone.forID("Europe/Paris")); 
LocalDate firstOfThisMonth = today.withDayOfMonth(1); 
LocalDate firstOfLastMonth = firstOfThisMonth.minusMonths(1); 
LocalDate endOfLastMonth = firstOfThisMonth.minusDays(1); 
+0

Vedere il mio [risposta simile r] (http://stackoverflow.com/a/26321291/642706) per duplicare la domanda per ulteriori discussioni su questo tipo di codice. –

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(); 
Problemi correlati