Java Calendar restituisce mese sbagliato


Voglio memorizzare una data in un oggetto Calendar, in questo modo:

Calendar cal = Calendar.getInstance();
cal.setTimeZone(TimeZone.getTimeZone("UTC"));
cal.set(Calendar.YEAR, 2017);
cal.set(Calendar.MONTH, Calendar.JUNE);
cal.set(Calendar.DAY_OF_YEAR, 26);
cal.set(Calendar.HOUR_OF_DAY, 9);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);

Tutti i valori sono impostati correttamente, tranne il mese e se chiamo cal.getTime() restituisce:

Thu Jan 26 10:00:00 CET 2017

Cosa sto facendo di sbagliato?

Author: Pau, 2017-06-27

2 answers

Quando si utilizza DAY_OF_YEAR si imposta il giorno numerico dell'anno corrente.

DAY_OF_YEAR Numero di campo per get e set che indica il numero del giorno entro l'anno in corso.

Questo sovrascrive tutte le configurazioni sensibili come mese o anno (all'anno corrente e al mese del giorno del numero).


Quindi invece di usare DAY_OF_YEAR puoi usare DAY_OF_MONTH che sembra è quello che stai cercando, questo imposta il giorno del mese che hai impostato prima.

DAY_OF_MONTH Numero di campo per get e set che indica il giorno del mese. Questo è sinonimo di DATA. Il primo giorno del mese ha valore 1.

Quindi la configurazione che stai cercando in modo definito sembra essere come successivo:

Calendar cal = Calendar.getInstance();
cal.setTimeZone(TimeZone.getTimeZone("UTC"));
cal.set(Calendar.YEAR, 2017);
cal.set(Calendar.MONTH, Calendar.JUNE);
cal.set(Calendar.DAY_OF_MONTH , 26);
cal.set(Calendar.HOUR_OF_DAY, 9);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);

Quindi quando chiami getTime otterrai:

Lun giu 26 11:00:00 CEST 2017

 4
Author: Pau, 2017-06-27 06:41:18

Come menzionato in " Perché Java Calendar set(int year, int month, int date) non restituisce la data corretta?" questo è un modo semplice per inizializzare un oggetto Calendar.

Calendar cal = Calendar.getInstance();
cal.setTimeZone(TimeZone.getTimeZone("UTC"));
cal.set(2017, Calendar.JUNE, 26, 9, 0, 0);
cal.set(Calendar.MILLISECOND, 0);


System.out.println(cal.getTime());

Lun giu 26 11:00:00 CEST 2017

 1
Author: Manuel Drieschmanns, 2017-06-28 07:39:07