1. Introduzione
Nei sistemi legacy, potrebbe essere necessario lavorare con le date quando non sono disponibili né la nuova API di data e ora né la libreria Joda-Time altamente consigliata.
In questo breve tutorial, daremo uno sguardo a diversi approcci per vedere come ottenere la data corrente nei sistemi pre-Java 8 .
2. Ora di sistema
Quando tutto ciò di cui abbiamo bisogno è un singolo valore numerico che rappresenti la data e l'ora correnti, possiamo utilizzare l'ora di sistema. Per ottenere il numero di millisecondi trascorsi dal 1 gennaio 1970 alle 00:00:00 GMT possiamo utilizzare il metodo currentTimeMillis che restituisce un long :
long elapsedMilliseconds = System.currentTimeMillis();
Quando vogliamo misurare il tempo trascorso con maggiore precisione, possiamo utilizzare il metodo nanoTime . Questo restituirà il valore dei nanosecondi che sono passati da un momento fisso ma arbitrario.
Questo tempo arbitrario è lo stesso per tutte le chiamate all'interno della JVM, quindi il valore restituito è utile solo per calcolare la differenza in nanosecondi trascorsi tra più chiamate di nanoTime :
long elapsedNanosecondsStart = System.nanoTime(); long elapsedNanoseconds = System.nanoTime() - elapsedNanosecondsStart;
3. Il pacchetto java.util
Usando le classi del pacchetto java.util , possiamo rappresentare un momento nel tempo, di solito dai millisecondi trascorsi dal 1 gennaio 1970 00:00:00 GMT .
3.1. java.util.Date
Possiamo rappresentare una data e un'ora specifiche utilizzando un oggetto Date . Contiene una precisione di millisecondi e le informazioni sul fuso orario .
Sebbene siano disponibili molti costruttori, il modo più semplice per creare un oggetto Date che rappresenti la data corrente nel fuso orario locale è utilizzare il costruttore di base:
Date currentUtilDate = new Date();
Creiamo ora un oggetto Date per una data e un'ora specifiche. Potremmo usare i suddetti costruttori e semplicemente passare il valore dei millisecondi.
In alternativa, possiamo utilizzare la classe SimpleDateFormat per convertire un valore String in un oggetto Date effettivo :
SimpleDateFormat dateFormatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); Date customUtilDate = dateFormatter.parse("30-01-2020 10:11:12");
Possiamo utilizzare un'ampia gamma di modelli di data per soddisfare le nostre esigenze.
3.2. java.util.Calendar
Un oggetto Calendar può fare ciò che fa una data ed è migliore per i calcoli aritmetici della data poiché può anche richiedere una Locale . Possiamo specificare le impostazioni locali come una regione geografica, politica o culturale.
Per ottenere la data corrente, senza TimeZone o Locale specificati, possiamo utilizzare il metodo getInstance :
Calendar currentUtilCalendar = Calendar.getInstance();
E per la conversione da calendario a data , possiamo semplicemente utilizzare il metodo getTime :
Date currentDate = Calendar.getInstance().getTime();
Come un fatto divertente, la classe GregorianCalendar è l'implementazione del calendario più utilizzato al mondo.
4. Il pacchetto java.sql
Successivamente, esploreremo tre estensioni della classe java.util.Date che rappresenta gli oggetti SQL equivalenti.
4.1. java.sql.Date
Con un oggetto java.sql.Date , non abbiamo accesso alle informazioni sul fuso orario e la precisione viene troncata a livello di giorno . Per rappresentare oggi, possiamo usare il costruttore che richiede una lunga rappresentazione di millisecondi:
Date currentSqlDate = new Date(System.currentTimeMillis());
Come prima, per una data specifica, possiamo usare la classe SimpleDateFormat per convertire prima in un java.util.Date e poi ottenere i millisecondi usando il metodo getTime . Quindi, possiamo passare questo valore al costruttore java.sql.Date .
Possiamo semplicemente usare il metodo valueOf quando la rappresentazione String di una data corrisponde al modello yyyy- [m] m- [d] d :
Date customSqlDate = Date.valueOf("2020-01-30");
4.2. java.sql.Time
L' oggetto java.sql.Time offre accesso alle informazioni su ora, minuti e secondi , ancora una volta, senza accesso a un fuso orario. Otteniamo l' ora corrente utilizzando la rappresentazione in millisecondi:
Time currentSqlTime = new Time(System.currentTimeMillis());
Per specificare un'ora utilizzando il metodo valueOf , possiamo passare un valore corrispondente al modello hh: mm: ss :
Time customSqlTime = Time.valueOf("10:11:12");
4.3. java.sql.Timestamp
In quest'ultima sezione, combineremo le informazioni di data e ora SQL utilizzando la classe Timestamp . Questo ci permette di avere una precisione fino ai nanosecondi .
Creiamo un oggetto Timestamp passando ancora una volta un valore lungo per il numero corrente di millisecondi al costruttore:
Timestamp currentSqlTimestamp = new Timestamp(System.currentTimeMillis());
Infine, creiamo un nuovo Timestamp personalizzato utilizzando il metodo valueOf con il pattern yyyy- [m] m- [d] d hh: mm: ss [.f…] richiesto :
Timestamp customSqlTimestamp = Timestamp.valueOf("2020-1-30 10:11:12.123456789");
5. conclusione
In questo breve tutorial, abbiamo visto come ottenere la data corrente e la data per un dato istante senza l'uso di Java 8 o di qualsiasi libreria esterna.
Come sempre, il codice dell'articolo è disponibile su GitHub.