Domanda

Vorrei fare semplici calcoli della data in Java. Ad esempio, calcola la differenza in giorni tra le date (con un componente 0 time). Ovviamente potresti fare una semplice sottostrazione di millisecondi, divisa per il numero di millisecondi al giorno, che funziona benissimo - fino a quando l'ora legale entra nella scena. Sono consapevole che interpretazioni diverse della "differenza di giorni" sono possibili, in particolare, se si debba tener conto della componente temporale o meno. Supponiamo di avere una componente temporale 0 per semplicità.

Questo tipo di calcolo sembra essere un'esigenza molto comune e troverei bello avere una discussione su diversi approcci alla domanda.

È stato utile?

Soluzione

Vorrei dare un'occhiata alla Joda e in particolare alla ReadableInterval class.

Joda rende la vita molto più semplice quando si manipolano date / orari in Java, e credo che sia la base del nuovo Java JSR 310 wrt. date / orari. cioè (o qualcosa di molto simile) sarà presente in una futura versione di Java.

Altri suggerimenti

Sembra che Date, Calendar e DateUtils faranno tutto ciò che stai cercando. http://commons.apache.org/ lang / api / org / apache / comuni / lang / tempo / DateUtils.html

DateUtils consente di troncare o arrotondare l'ora in modo da poter gestire solo le date. Hai anche menzionato l'ora legale. Il problema principale è quando qualcuno dice di aver fatto qualcosa all'01: 30 in un giorno in cui c'era un cambio dell'ora legale ... quale era l'01: 30? Il primo o il secondo? Fortunatamente, questo può essere gestito dalla classe Calendar poiché memorizza il fuso orario e l'offset DST. Per i dettagli su tutto ciò, dai un'occhiata a questo: http://www.xmission.com/~goodhill/dates/deltaDates.html

L'opzione più semplice è utilizzare le classi Giorni, Settimane, Mesi e Anni di Joda.

In questo modo, puoi fare qualcosa di semplice come:

int daysDifference = Days.daysBetween(startInstant, endInstant).getDays();

Ecco un articolo discutere l'uso delle funzioni Data / Calendario in java per calcolare il tempo trascorso.

Uso di java.time

L'approccio moderno è con le classi java.time, soppiantando le vecchie problematiche classi data-ora.

  

calcola la differenza in giorni tra le date (con una componente 0 time)

Il LocalDate rappresenta un valore di sola data senza ora del giorno e senza fuso orario.

ChronoUnit enum ha alcuni metodi utili come tra .

Nel definire gli intervalli di tempo, le classi java.time usano l'approccio Half-Open in cui l'inizio è inclusivo mentre il finale è esclusivo .

LocalDate start = LocalDate.of( 2017 , Month.JANUARY , 23 );
LocalDate stop = LocalDate.of( 2017 , Month.FEBRUARY , 17 );
long daysBetween = ChronoUnit.DAYS.between( start , stop );

Puoi rappresentare questo arco di tempo come oggetto, usando Period class.

Period p = Period.between( start , stop );

Informazioni su java.time

Il java.time framework è integrato in Java 8 e versioni successive. Queste classi soppiantano le vecchie e problematiche legacy come date java.util.Date , Calendar , & amp ; SimpleDateFormat .

Il Joda-Time , ora in modalità di manutenzione , consiglia la migrazione a classi java.time .

Per saperne di più, consulta il Tutorial Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .

Dove ottenere le classi java.time?

scroll top