UPDATE Il progetto Joda-Time, ora in maintenance mode, consiglia migrazione ai java.time classi. Vedi the Answer di Anees A per l'uso di ChronoUnit
e altre classi java.time.
Joda Time
Le vecchie classi java.util.Date/.Calendar sono notoriamente fastidioso e dovrebbero essere evitati.
Utilizzare invece la libreria Joda-Time. A meno che tu non abbia la tecnologia Java 8, nel qual caso usa il suo successore, il framework java.time incorporato (non in Android dal 2015).
Poiché ti interessano solo i "giorni" definiti come date (non i periodi di 24 ore), concentriamoci sulle date. Joda-Time offre la classe LocalDate
per rappresentare un valore di sola data senza orario o fuso orario.
Mentre manca un fuso orario, notare che il fuso orario è cruciale nel determinare una data come "oggi". Un nuovo giorno sorge prima ad est che ad ovest. Quindi la data non è la stessa in tutto il mondo in un momento, la data dipende dal tuo fuso orario.
DateTimeZone zone = DateTimeZone.forID ("America/Montreal");
LocalDate today = LocalDate.now (zone);
Contiamo il numero di giorni fino alla prossima settimana, che dovrebbe ovviamente essere sette.
LocalDate weekLater = today.plusWeeks (1);
int elapsed = Days.daysBetween (today , weekLater).getDays();
La getDays
sull'estremità estrae una pianura int
numero dall'oggetto Days
restituito da daysBetween
.
Dump alla console.
System.out.println ("today: " + today + " to weekLater: " + weekLater + " is days: " + days);
oggi: 2015/12/22 a weekLater: 2015/12/29 è giorni: 7
Hai oggetti Calendario. Dobbiamo convertirli in oggetti Joda-Time. Internamente gli oggetti del Calendario hanno un intero long
che traccia il numero di millisecondi dall'epoca del primo momento del 1970 in UTC. Possiamo estrarre quel numero e alimentarlo a Joda-Time. Dobbiamo anche assegnare il fuso orario desiderato con il quale intendiamo determinare una data.
long startMillis = myStartCalendar.getTimeInMillis();
DateTime startDateTime = new DateTime(startMillis , zone);
long stopMillis = myStopCalendar.getTimeInMillis();
DateTime stopDateTime = new DateTime(stopMillis , zone);
Convertire da oggetti DateTime a LocalDate.
LocalDate start = startDateTime.toLocalDate();
LocalDate stop = stopDateTime.toLocalDate();
Ora eseguire lo stesso calcolo precedente che abbiamo visto in precedenza.
int elapsed = Days.daysBetween (start , stop).getDays();
Domande come questo è il motivo per cui hanno scritto tempo Joda. Il calendario Java è così disperato ... Devi usarlo? – iluxa
Causa se è necessario, mi piacerebbe convertire sia per Millis e lavorare con questi, francamente :-) – iluxa