Utilizzando java.time
Il progetto Joda-Time è ora in maintenance mode, con il team di consulenza di migrazione alle java.time classi. Vedi Tutorial by Oracle.
La classe LocalDate
rappresenta un valore di sola data senza ora del giorno e senza fuso orario.
LocalDate start = LocalDate.of(2017 , Month.JANUARY , 23) ;
LocalDate stop = LocalDate.of(2017 , Month.FEBRUARY , 2) ;
A proposito, è possibile aggiungere un controllo di integrità per verificare che il finale non sia prima dell'inizio.
Non dopo
Credo la logica che si sta cercando, per includere la data di fine, è “non dopo”. La classe LocalDate
include un metodo isAfter
, al quale è possibile aggiungere un "NOT" logico (!
).
Inoltre, un loop while
sembra più appropriato e autoesplicativo in questa situazione rispetto al ciclo for
.
LocalDate ld = start ;
List<LocalDate> dates = new ArrayList<>() ;
while (! ld.isAfter(stop)) {
dates.add(ld); // Collect this date.
ld = ld.plusDays(1) ; // Setup the next loop.
}
Vedere questo code run live at IdeOne.com.
date: [2017-01-23, 2017-01-24, 2017-01-25, 2017-01-26, 2017-01-27, 2017-01-28, 2017-01-29 , 2017/01/30, 2017/01/31, 2017/02/01, 2017/02/02]
semiaperta
l'iterazione si ferma quando currentDate raggiunge il giorno prima endDate
Questo è effettivamente auspicabile. Conosciuto come Half-Open, l'approccio comune nella gestione della data-ora è considerare l'inizio come compreso mentre il finale è esclusivo. Quindi una pausa pranzo inizia alle 12:00:00 (mezzogiorno) e arriva fino a, ma non include, 13:00:00 (13:00). Il mese di gennaio inizia il 1 ° gennaio e arriva fino a, ma non include, il 1 ° febbraio. Una settimana inizia il lunedì e arriva fino a, ma non include il lunedì successivo. Molto utile, questo approccio evita il problema di determinare l'ultimo secondo di una data-ora in cui alcuni sistemi usano millisecondi (x.999), alcuni (x.999999), stessi nanosecondi (x.999999999), e altri usano variazioni come come 5 posizioni decimali (x.99999). Invece andiamo a, ma non includo, il primo momento della prossima ora o giorno ecc.
Trovo che l'utilizzo dell'approccio Half-Open in modo coerente nel mio codice semplifica la lettura del codice, la comprensione più facile e molto meno probabile che si traduca in bug fuori-da-uno. Sono stato coinvolto in innumerevoli problemi di mistero finanziario che si sono rivelati confusione o malintesi su un rapporto che riguardava la data per le date inclusive vs exclusive. Quindi, se possibile, istruisci i tuoi utenti a pensare in modo coerente alla modalità semi-aperta. Se non è fattibile, regola il tuo codice in modo che la tua logica e i loop utilizzino Half-Open internamente almeno.
Ecco un codice simile a quello precedente, ma utilizzando isBefore
anziché NOT isAfter
, per utilizzare l'approccio Half-Open. Il finale è il 3 febbraio invece del 2 febbraio.
LocalDate start = LocalDate.of(2017 , Month.JANUARY , 23) ;
LocalDate stop = LocalDate.of(2017 , Month.FEBRUARY , 3) ; // Third instead of the Second of February, to be half-open.
LocalDate ld = start ;
List<LocalDate> dates = new ArrayList<>() ;
while (ld.isBefore(stop)) { // Using "isBefore" for Half-Open approach.
dates.add(ld); // Collect this date.
ld = ld.plusDays(1) ; // Setup the next loop.
}
Vedere questo code run live at IdeOne.com.
inizio: 2017-01-23 | stop: 2017-02-03
date: [2017-01-23, 2017-01-24, 2017-01-25, 2017-01-26, 2017-01-27, 2017-01-28, 2017/01/29, 2017/01/30, 2017/01/31, 2017/02/01, 2017/02/02]
Chi java.time
Il quadro java.time è integrato in Java 8 e versioni successive. Queste classi soppiantano le fastidiose classi data legacy come java.util.Date
, Calendar
, & SimpleDateFormat
.
Il progetto Joda-Time, ora in maintenance mode, consiglia la migrazione alle classi java.time.
Per ulteriori informazioni, vedere Oracle Tutorial. E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310.
Dove ottenere le classi java.time?
- Java SE 8, Java SE 9, e più tardi
- incorporato.
- Parte dell'API Java standard con un'implementazione in bundle.
- Java 9 aggiunge alcune funzionalità e correzioni minori.
- Java SE 6 e Java SE 7
- Molte delle funzionalità java.time è di back-porting per Java 6 .
- Android
Il progetto ThreeTen-Extra java.time prolunga con classi aggiuntive. Questo progetto è un terreno di prova per possibili aggiunte future a java.time. È possibile trovare alcune classi utili come Interval
, YearWeek
, YearQuarter
e more.
'!currentDate.isAfter (endDate) 'è più corto di' currentdate.isBefore (endDate) || currentdate.isEqual (endDate) '. In altre parole, usa "NON è maggiore di" in quanto una versione più breve di "è minore o uguale a". Vedi [la mia risposta] (https://stackoverflow.com/a/44320192/642706) per un esempio completo. E ora vedo [questa risposta] (https://stackoverflow.com/a/44316083/642706) ha la stessa idea, ma nel ciclo 'for' contro il mio ciclo 'while'. –