Domanda

Trovo divertente che Java (o la libreria java.util) non abbia una funzione integrata per calcolare la differenza nelle date. Voglio sottrarre una data da un'altra per ottenere il tempo trascorso tra di loro. Qual è il modo migliore per farlo?

So che il modo semplice è prendere la differenza di tempo in millisecondi e poi convertirla in giorni. Tuttavia, volevo sapere se funziona in tutti i casi (con l'ora legale, ecc.).

È stato utile?

Soluzione

  

So che il modo semplice è prendere il   differenza del tempo in millisecondi   e poi convertilo in giorni.   Tuttavia, volevo sapere se questo   funziona in tutti i casi (con la luce del giorno   risparmio, ecc.).

Se i tuoi orari sono derivati ??dalle date UTC o sono solo la differenza tra due chiamate a System.getCurrentTimeMillis () misurate sullo stesso sistema, otterrai un numero valido di millisecondi come differenza, indipendentemente da eventuali problemi di fuso orario . (motivo per cui tutto dovrebbe usare UTC come formato di archiviazione - è molto più semplice passare dall'ora locale UTC- > se provi ad andare diversamente, devi memorizzare il fuso orario locale insieme all'ora locale - - o prova a dedurlo, gack!)

Per quanto riguarda la trasformazione di questo in un numero di giorni, dovresti essere in grado di dividere per 86400000 ... con l'avvertenza che c'è un occasionale balza secondo ogni due anni circa.

Altri suggerimenti

Java non manca molto, se guardi all'open source: prova Joda-Time .

Utilizzare Joda-Time o il nuovo pacchetto java.time in Java 8.

Entrambi i framework usano l'approccio semi-aperto in cui l'inizio è inclusivo mentre la fine è esclusiva . A volte indicato come [) . Questo è generalmente l'approccio migliore per definire gli intervalli di tempo.

java.time

Il framework java.time incorporato in Java 8 e versioni successive ha una classe Period per rappresentare un intervallo di tempo in un numero di anni, un numero di mesi e un numero di giorni. Ma questa lezione è limitata a giorni interi, nessuna rappresentazione di ore, minuti e secondi.

Nota che specifichiamo un fuso orario, fondamentale per determinare una data. Ad esempio, un nuovo giorno nasce prima in Parigi rispetto a Montr & # 233; al .

ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate now = LocalDate.now( zoneId );
LocalDate then = LocalDate.of( 2001, 1, 1 );
Period period = Period.between( then, now );
  

Quindi: 2001-01-01. Ora: 2015-09-07. Periodo: P14Y8M6D. Giorni: 5362

Per intere giornate, quindi Ora legale (DST) è irrilevante.

Se si desidera un conteggio dei giorni totali, utilizzare ChronoUnit che include alcuni metodi di calcolo. Si noti che i calcoli restituiscono un lungo.

long days = ChronoUnit.DAYS.between( then, now );  // "5362" seen above.

Ho chiesto di fare un periodo completo in java.time, inclusi ore, minuti, secondi. Non possibile a partire da Java 8. Una soluzione alternativa sorprendente utilizzando le librerie in bundle è stata suggerita da Meno Hochschild : utilizzare un Duration trovato nella classe pacchetto javax.xml.datatype .

Joda Time

Ecco un esempio di codice in Joda-Time 2.3.

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime start = new DateTime( 2014, 1, 2, 3, 4, 5, timeZone );
DateTime stop = new DateTime( 2014, 5, 2, 3, 4, 5, timeZone );
Period period = new Period( start, stop );

Chiamando toString otterrai una rappresentazione di stringa nella forma definita da ISO 8601 standard, PnYnMnDTnHnMnS .

Con la libreria date4j :

int numDaysBetween = oneDate.numDaysFrom(anotherDate);

C'è un modo semplice per implementarlo. Possiamo usare il metodo Calendar.add con loop. Ad esempio, come di seguito,

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

Date beginDate = dateFormat.parse("2013-11-29");
Date endDate = dateFormat.parse("2013-12-4");

Calendar beginCalendar = Calendar.getInstance();
beginCalendar.setTime(beginDate);

Calendar endCalendar = Calendar.getInstance();
endCalendar.setTime(endDate);

I giorni meno compresi tra beginDate e endDate e il codice come di seguito,

int minusDays = 0;
while (true) {
  minusDays++;

  // Day increasing by 1
  beginCalendar.add(Calendar.DAY_OF_MONTH, 1);

  if (dateFormat.format(beginCalendar.getTime()).
            equals(dateFormat.format(endCalendar).getTime())) {
    break;
  }
}
System.out.println("The substractation between two days is " + (minusDays + 1));

Buon divertimento! @. @

Non sono d'accordo con l'affermazione che Java non ha un meccanismo per calcolare la differenza tra le date.

Java è stato progettato per un uso globale. È stato progettato in modo che non vi sia un concetto di data, esiste solo un concetto di "tempo in millisecondi". Qualsiasi interpretazione di un tempo universale come l'ora e la data in un luogo specifico ai sensi di una convenzione specifica è semplicemente una proiezione o una visione.

La classe del calendario viene utilizzata per trasformare questo tipo di tempo assoluto in date. È inoltre possibile aggiungere o sottrarre componenti di data, se proprio necessario. L'unico modo per fornire una differenza in termini di componenti tra due volte sarebbe il calendario generato e specifico. Pertanto, si potrebbe sostenere che la libreria standard non include un calendario gregoriano abbastanza intelligente, e sarei d'accordo che ne lasci un po 'a desiderare.

Detto questo, ci sono numerose implementazioni di questo tipo di funzionalità, vedo che altri hanno fornito esempi.

L'implementazione di Java delle date è scadente. Se trovi Joda-Time troppo complicato, prova il mio piccolo contributo all'open source: http://calendardate.sourceforge.net/javadoc/index.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top