Ottieni la data corrente precedente a Java 8

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.