Stiamo usando Calendar. roll per spostare le date in alto o in basso. Javadoc afferma che i campi più grandi non vengono modificati (cioè se spostiamo la data per 5 a sinistra a partire dal primo giorno del mese, sfortunatamente calendar.getTime() non mi ottiene un valore dal mese precedente) . Il valore del mese rimane invariato, come posso cambiare questo comportamento. Mi piacerebbe davvero spostare il valore della data come appropriato. (Ad esempio, se avessi spostato 5 giorni a sinistra il 1 ° agosto 2010, vorrei vederlo il 27 giugno 2010 anziché il 27 agosto 2010). Cosa mi manca qui?L'operazione di roll-out del calendario non mi fornisce l'output corretto
risposta
È possibile utilizzare Calendar.add
con un valore amount
negativo.
È necessario utilizzare add(Calendar.DATE, -5)
method from Calendar
a causa del controllo della regola del rotolo.
roll
metodo è descritto come:
Aggiungi al
field
una quantità firmato senza mutevoli campi più grandi. Un valore di rotolo negativo significa sottrarre dal campo senza modificare i campi più grandi.Esempio: Si consideri un
GregorianCalendar
originariamente prevista al 31 agosto, 1999. Callingroll(Calendar.MONTH, 8)
set il calendario per il 30 aprile 1999. Utilizzando un GregorianCalendar, il campoDAY_OF_MONTH
non può essere 31 nel mese di aprile.DAY_OF_MONTH
è impostato al possibile valore più vicino, 30. IlYEAR
campo mantiene il valore del 1999, perché è un campo più grande diMONTH
.Esempio: Si consideri un
GregorianCalendar
originariamente impostato su Domenica 6 giugno 1999. Callingroll(Calendar.WEEK_OF_MONTH, -1)
imposta il calendario per Martedì 1 giugno 1999, mentre chiamandoadd(Calendar.WEEK_OF_MONTH, -1)
set calendario per Domenica 30 maggio, 1999. Questo è poiché la regola del rotolo impone un ulteriore vincolo:MONTH
non deve cambiare quando viene eseguito il rolloverWEEK_OF_MONTH
. Nel loro insieme con add regola 1, la data risultante deve essere tra Martedì 1 giugno e Sabato 5 giugno Ai sensi aggiungere regola 2, ilDAY_OF_WEEK
, un invariante quando cambiare ilWEEK_OF_MONTH
, è impostato su Martedì, la più vicina valore possibile a domenica (dove domenica è il primo giorno della settimana).