2010-08-23 2 views
5

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

10

È possibile utilizzare Calendar.add con un valore amount negativo.

7

È 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. Calling roll(Calendar.MONTH, 8) set il calendario per il 30 aprile 1999. Utilizzando un GregorianCalendar, il campo DAY_OF_MONTH non può essere 31 nel mese di aprile. DAY_OF_MONTH è impostato al possibile valore più vicino, 30. Il YEAR campo mantiene il valore del 1999, perché è un campo più grande di MONTH.

Esempio: Si consideri un GregorianCalendar originariamente impostato su Domenica 6 giugno 1999. Calling roll(Calendar.WEEK_OF_MONTH, -1) imposta il calendario per Martedì 1 giugno 1999, mentre chiamando add(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 rollover WEEK_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, il DAY_OF_WEEK, un invariante quando cambiare il WEEK_OF_MONTH, è impostato su Martedì, la più vicina valore possibile a domenica (dove domenica è il primo giorno della settimana).