Altre risposte sono corrette, in particolare la risposta java.time di arganzheng . Come alcuni hanno già detto, dovresti evitare le vecchie classi java.util.Date/.Calendar in quanto sono progettate male, confuse e fastidiose. Sono stati soppiantati dalle classi java.time.
Vorrei aggiungere note sulla strategia di gestione della mezzanotte e degli intervalli di tempo .
Mezzo aperto
Nel lavoro con data e ora, gli intervalli di tempo sono spesso definiti usando l'approccio "Half-Open". In questo approccio l'inizio è inclusivo mentre il finale è esclusivo . Ciò risolve i problemi e, se utilizzato in modo coerente, rende molto più semplice il ragionamento sulla gestione della data e dell'ora.
Un problema risolto è la definizione della fine della giornata. È l'ultimo momento della giornata 23:59:59.999
( millisecondi )? Forse, nella classe java.util.Date (dalla prima Java; problematica - evita questa classe!) E nella libreria Joda-Time di grande successo . Ma in altri software, come database come Postgres, l'ultimo momento sarà 23:59:59.999999
( microsecondi ). Ma in altri software come il framework java.time (integrato in Java 8 e versioni successive, successore di Joda-Time) e in alcuni database come il database H2 , l'ultimo momento potrebbe essere 23:59.59.999999999
( nanosecondi ). Piuttosto che spaccare i capelli, pensa solo in termini di primo momento, non ultimo.
In Half-Open, un giorno parte dal primo momento di un giorno e va fino a, ma non include il primo momento del giorno successivo. Quindi, piuttosto che pensare in questo modo:
... da oggi alle 00:00 (mezzanotte presto questa mattina) alle 12:00 (mezzanotte stasera).
... pensa così ...
dal primo momento di oggi fino al primo momento di domani escluso:
(> = 00:00:00.0
oggi E < 00:00:00.0
domani)
Nel lavoro con database, questo approccio significa non usare l' BETWEEN
operatore in SQL.
Inizio giornata
Inoltre, il primo momento della giornata non è sempre l'ora del giorno 00:00:00.0
. L'ora legale (DST) in alcuni fusi orari, e possibilmente altre anomalie, può significare che un'ora diversa inizia il giorno.
Quindi lascia che le classi java.time facciano il lavoro per determinare l'inizio di una giornata con una chiamata a LocalDate::atStartOfDay( ZoneId )
. Quindi dobbiamo deviare LocalDate
e tornare a ZonedDateTime
come puoi vedere in questo codice di esempio.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );
ZonedDateTime todayStart = now.toLocalDate().atStartOfDay( zoneId );
ZonedDateTime tomorrowStart = todayStart.plusDays( 1 );
Nota il passaggio dell'opzionale ZoneId
. Se omesso, il fuso orario predefinito corrente di JVM viene applicato implicitamente. Meglio essere espliciti.
Il fuso orario è fondamentale per il lavoro data-ora. La domanda e alcune altre risposte sono potenzialmente imperfette perché non gestiscono consapevolmente il fuso orario.
Convertire
Se è necessario utilizzare java.util.Date o .Calendar, cercare nuovi metodi di conversione aggiunti a quelle vecchie classi.
java.util.Date utilDate = java.util.Date.from( todayStart.toInstant() );
java.util.GregorianCalendar gregCal = java.util.GregorianCalendar.from( todayStart );
Lasso di tempo
A proposito, se stai facendo molto lavoro con intervalli di tempo, dai un'occhiata a:
Duration
Period
Interval
La Interval
classe si trova nel progetto ThreeTen-Extra , un'estensione del framework java.time. Questo progetto è il banco di prova per possibili aggiunte future a java.time.
Interval todayMontreal = Interval.of( todayStart.toInstant() , tomorrowStart.toInstant() );
Informazioni su java.time
Il framework java.time è integrato in Java 8 e versioni successive. Queste classi soppiantare la vecchia fastidiosi legacy classi data-time come java.util.Date
, Calendar
, e SimpleDateFormat
.
Il progetto Joda-Time , ora in modalità manutenzione , consiglia la migrazione alle classi java.time .
Per saperne di più, consulta il tutorial Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .
Puoi scambiare oggetti java.time direttamente con il tuo database. Utilizzare un driver JDBC conforme a JDBC 4.2 o successivo. Non c'è bisogno di stringhe, non c'è bisogno di java.sql.*
classi.
Dove ottenere le classi java.time?
Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un banco di prova per possibili aggiunte future a java.time. Si possono trovare alcune classi utili, come per esempio Interval
, YearWeek
, YearQuarter
e altro .