Dato un Oggetto Date, come faccio a determinare l'ultimo giorno del mese?

StackOverflow https://stackoverflow.com/questions/72381

  •  09-06-2019
  •  | 
  •  

Domanda

Sto cercando di usare il seguente codice ma tornando sbagliato giorno del mese.

Calendar cal = Calendar.getInstance();
cal.setTime(sampleDay.getTime());
cal.set(Calendar.MONTH, sampleDay.get(Calendar.MONTH)+1);
cal.set(Calendar.DAY_OF_MONTH, 0);
return cal.getTime();
È stato utile?

Soluzione

Ottenere il numero di giorni di questo mese:


Calendar cal = Calendar.getInstance();
cal.setTime(sampleDay.getTime());
int noOfLastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);

Il Calendario indica l'ultimo giorno di questo mese:


Calendar cal = Calendar.getInstance();
cal.setTime(sampleDay.getTime());
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));

Altri suggerimenti

Vorrei creare un oggetto date per il primo giorno del mese SUCCESSIVO, e poi basta sottrarre un solo giorno dalla data oggetto.

tl;dr

YearMonth.from(
    LocalDate.now( ZoneId.of( "America/Montreal" ) )
).atEndOfMonth()

java.tempo

Le Domande e altre Risposte di utilizzare il vecchio obsoleto sistema di classi.Sono stati soppiantati dai java.tempo le classi sono costruite in Java 8 e versioni successive.Vedere Oracle Tutorial.Gran parte delle funzionalità è stato trasferito nuovamente a Java 6 e 7 in ThreeTen-Backport e ulteriormente adattato per Android ThreeTenABP.

LocalDate

Il LocalDate classe rappresenta un data-solo il valore senza tempo del giorno e senza di fuso orario.Mentre questi oggetti negozio senza fuso orario, nota che il fuso orario è di fondamentale importanza per determinare la data corrente.Per ogni dato momento, la data varia in tutto il mondo da fuso orario.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zoneId );  // 2016-06-25

YearMonth

Combinare con l' YearMonth classe per determinare ultimo giorno di ogni mese.

YearMonth currentYearMonth = YearMonth.from( today );  // 2016-06
LocalDate lastDayOfCurrentYearMonth = currentYearMonth.atEndOfMonth();  // 2016-06-30

A proposito, sia LocalDate e YearMonth utilizzare i numeri del mese, come ci si aspetterebbe (1-12), piuttosto che la screwball 0-11 visto nel vecchio data di classi a tempo.Uno dei tanti poveri decisioni di progettazione che fanno quelli di vecchia data e l'ora di classi, in modo problematico e fonte di confusione.

TemporalAdjuster

Un altro valido approccio utilizza un TemporalAdjuster.Vedere la Risposta corretta da Pierre Henry.

Utilizzare calObject.getActualMaximum(calobject.GIORNO_DEL_MESE)

Vedere Real Java How-to per ulteriori informazioni su questo.

Sembra che si imposta il calendario per il primo giorno del mese successivo, quindi hai bisogno di una linea in più per sottrarre un giorno, per ottenere l'ultimo giorno del mese che sampleDay si trova in:

Calendar cal = Calendar.getInstance();
cal.setTime(sampleDay.getTime());
cal.roll(Calendar.MONTH, true);
cal.set(Calendar.DAY_OF_MONTH, 0);
cal.add(Calendar.DAY_OF_MONTH, -1);

In generale, è molto più facile fare questo tipo di cose utilizzando Joda Tempo, ad esempio:

DateTime date = new DateTime(sampleDay.getTime());
return date.plusMonths(1).withDayOfMonth(0).minusDays(1).getMillis();

TemporalAdjuster

Utilizzando la (relativamente) nuova data del Java API, è in realtà molto semplice :

Lasciate date essere un'istanza di LocalDate, per esempio :

LocalDate date = LocalDate.of(2018, 1, 22);

o

LocalDate date = LocalDate.now();

o, naturalmente, si potrebbe ottenere un input dell'utente, da un database, etc.

Quindi applicare un'implementazione del TemporalAdjuster interfaccia trovato in TemporalAdjusters classe:

LocalDate first = date.with(TemporalAdjusters.firstDayOfMonth());
LocalDate last = date.with(TemporalAdjusters.lastDayOfMonth());

Se si utilizza il date4j libreria:

DateTime monthEnd = dt.getEndOfMonth();

Credo che questo dovrebbe funzionare bene:

Dim MyDate As Date = #11/14/2012#  'This is just an example date

MyDate = MyDate.AddDays(DateTime.DaysInMonth(MyDate.Year, MyDate.Month) - MyDate.Day)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top