Java Data e ora

โšก Riepilogo intelligente

Java La gestione di date e orari combina le classi legacy java.util.Date e SimpleDateFormat con la moderna API java.time introdotta in Java 8, fornendo agli sviluppatori tipi immutabili e thread-safe per un lavoro accurato sul calendario.

  • ๐Ÿ•’ Data di scadenza: La classe java.util.Date memorizza un istante in millisecondi e stampa una stringa predefinita tramite il metodo toString.
  • ๐Ÿ”ค Lettere modello: SimpleDateFormat utilizza lettere come yyyy, MM, dd, HH, mm, ss e zzz per definire formati di output personalizzati.
  • ๏ธ Confronto: Il metodo compareTo restituisce un numero intero negativo, zero o positivo per ordinare cronologicamente due istanze di Date.
  • ๐Ÿ†• API moderna: LocalDate, LocalDateTime, ZonedDateTime e Instant in java.time sostituiscono Date e Calendar con oggetti immutabili.
  • ๐Ÿงต Sicurezza del filo: DateTimeFormatter รจ immutabile e puรฒ essere condiviso in sicurezza, mentre SimpleDateFormat richiede la sincronizzazione o un wrapper ThreadLocal.
  • ๐Ÿ” interoperabilitร : Converti tra le vecchie e le nuove API utilizzando le funzioni di supporto Date.toInstant, Date.from e Calendar.toInstant.

Java Data e ora

Gestione di date e orari in Java รˆ una parte di routine della creazione della logica di pianificazione, dei timestamp di registrazione, dei report e delle tracce di controllo. Prima di scrivere qualsiasi codice, รจ utile conoscere i parametri che compongono una data:

  • Migliori anno (a due o quattro cifre).
  • Migliori mese (come due cifre, come le prime tre lettere del mese o come il nome completo del mese).
  • Migliori quando (il numero effettivo del giorno del mese).
  • Migliori giorno (il nome del giorno nella data indicata, ad esempio dom, lun, mar).

Java Espone molti altri parametri che descrivono un momento sulla linea temporale, tra cui l'era, la settimana dell'anno, il fuso orario e l'offset. Le sezioni seguenti illustrano ciascuno di essi con esempi eseguibili.

Come utilizzare Data in Java

Visualizza la data in Java

Java fornisce un Date classe in java.util pacchetto. La classe memorizza un istante specifico nel tempo con precisione al millisecondo e offre metodi di supporto per stampare, confrontare e formattare tale istante. Per ottenere la data e l'ora correnti, istanziare la classe con il suo costruttore predefinito:

import java.util.Date;

class Date_Ex1 {
    public static void main(String args[]) {
        // Instantiate a Date object by invoking its constructor
        Date objDate = new Date();
        // Display the Date and Time using toString()
        System.out.println(objDate.toString());
    }
}

Produzione:

Wed Nov 29 06:36:22 UTC 2017

L'esempio stampa la data nel formato predefinito toString. Per visualizzare lo stesso istante in un modello diverso, รจ necessario prima comprendere le lettere di formattazione che Java utilizza.

SimpleDateFormat: analizza e formatta le date

Migliori SimpleDateFormat classe in java.text converte un Date oggetto in una stringa formattata e analizza una stringa formattata di nuovo in un DateUtilizza lettere schematiche che corrispondono a una data o a un'ora. La tabella seguente elenca tutte le lettere supportate:

LetteraComponente data o oraEsempio
GDesignatore dell'eraAD
yAnno2026
MMese nell'annoLuglio o luglio o 07
wSettimana nell'anno27
WSettimana nel mese2
DGiorno dell'anno189
dGiorno del mese10
FGiorno della settimana nel mese2
ENome del giorno nella settimanaMartedรฌ o martedรฌ
uNumero del giorno della settimana (1 = Monday, 7 = Domenica)1
aIndicatore AM o PMPM
HOra del giorno (0-23)0
kOra del giorno (1-24)24
KOra in AM o PM (0-11)0
hOra in AM o PM (1-12)12
mMinuto in ora30
sSecondo in minuto55
Smillisecondo978
zFuso orario (nome)Ora solare del Pacifico; PST; GMT-08:00
ZFuso orario (offset RFC 822) all'0800 ottobre
XFuso orario (offset ISO 8601)-08 o -0800:08 o -00:XNUMX

Non รจ necessario memorizzare l'intera tabella. Consultatela ogni volta che create un nuovo schema.

Come utilizzare SimpleDateFormat

SimpleDateFormat รจ una sottoclasse di DateFormat che consente di formattare e analizzare le date utilizzando le lettere del modello sopra. Combina le lettere per descrivere la stringa esatta che desideri produrre o leggere.

Per esempio:

  1. Formato data richiesto: 2012.10.23 20:20:45 PST. Il modello di formato appropriato รจ yyyy.MM.dd HH:mm:ss zzz.
  2. Formato data richiesto: 09:30:00 AM 23-May-2012. Il modello di formato appropriato รจ hh:mm:ss a dd-MMM-yyyy.

Suggerimento: Attenzione alle maiuscole e minuscole. M รจ mese, minuscolo m รจ minuto. Maiuscolo H รจ un orologio a 24 ore, minuscolo h รจ un orologio a 12 ore. Scambiandoli si ottiene un risultato errato senza alcun rumore.

Il programma seguente stampa la data corrente due volte: una volta nel formato predefinito e una volta utilizzando il formato SimpleDateFormat:

import java.text.SimpleDateFormat;
import java.util.Date;

class TestDates_Format {
    public static void main(String args[]) {
        // Current system date and time is assigned to objDate
        Date objDate = new Date();
        System.out.println(objDate);

        // Build the target pattern and format the date
        String strDateFormat = "hh:mm:ss a dd-MMM-yyyy";
        SimpleDateFormat objSDF = new SimpleDateFormat(strDateFormat);
        System.out.println(objSDF.format(objDate));
    }
}

Produzione:

Wed Nov 29 06:31:41 UTC 2017
06:31:41 AM 29-Nov-2017

Esempio di confronto delle date

Esempio di confronto delle date

Il modo piรน affidabile per ordinare due Date gli oggetti sono compareTo() metodo. Restituisce un numero intero negativo quando il chiamante รจ precedente, zero quando entrambi gli istanti sono uguali e un numero intero positivo quando il chiamante รจ successivo. Il frammento di codice seguente analizza due stringhe di data e ne stampa l'ordine relativo:

import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.util.Date;

class TestDates_Compare {
    public static void main(String args[]) throws ParseException {

        SimpleDateFormat objSDF = new SimpleDateFormat("dd-MM-yyyy");
        Date dt_1 = objSDF.parse("20-08-1981");
        Date dt_2 = objSDF.parse("12-10-2012");

        System.out.println("Date1 : " + objSDF.format(dt_1));
        System.out.println("Date2 : " + objSDF.format(dt_2));

        // compareTo returns > 0 when dt_1 is after dt_2
        if (dt_1.compareTo(dt_2) > 0) {
            System.out.println("Date 1 occurs after Date 2");
        }
        // compareTo returns < 0 when dt_1 is before dt_2
        else if (dt_1.compareTo(dt_2) < 0) {
            System.out.println("Date 1 occurs before Date 2");
        }
        // compareTo returns 0 when both dates are equal
        else {
            System.out.println("Both are the same date");
        }
    }
}

Produzione:

Date1 : 20-08-1981
Date2 : 12-10-2012
Date 1 occurs before Date 2

Nota: Il codice originale utilizzava il modello dd-mm-yyyy. La minuscola mm La lettera indica il minuto, non il mese, quindi il parser ha prodotto silenziosamente un valore errato per il mese. La correzione sopra utilizza le maiuscole. MM per il mese, che รจ la lettera corretta del modello.

Java 8 API moderne per data e ora (java.time)

Java 8 ha introdotto il java.time pacchetto, un'API riprogettata ispirata alla libreria Joda-Time. Le nuove classi sono immutabili, thread-safe e separano il calendario umano dalla timeline della macchina. I tipi piรน comuni sono:

  • LocalDate per una data senza orario o fuso orario (ad esempio, un compleanno).
  • LocalTime per un orologio da parete senza data nรฉ fuso orario.
  • LocalDateTime per una data e un'ora senza fuso orario.
  • ZonedDateTime per una data e un'ora con un fuso orario specifico.
  • OffsetDateTime per una data e un'ora con un offset UTC ma senza un fuso orario specificato.
  • Instant per un timestamp della macchina misurato dall'epoca UNIX.
  • Duration and Period per importi basati sul tempo e sulla data.

L'esempio seguente visualizza la data, l'ora, il timestamp e il fuso orario correnti utilizzando l'API moderna:

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.time.Instant;
import java.time.ZoneId;

class ModernDateDemo {
    public static void main(String args[]) {
        LocalDate today = LocalDate.now();
        LocalDateTime now = LocalDateTime.now();
        ZonedDateTime zoned = ZonedDateTime.now(ZoneId.of("Asia/Kolkata"));
        Instant epoch = Instant.now();

        System.out.println("LocalDate     : " + today);
        System.out.println("LocalDateTime : " + now);
        System.out.println("ZonedDateTime : " + zoned);
        System.out.println("Instant       : " + epoch);
    }
}

Ogni tipo ha metodi di fabbrica (now, of, parse) e operazioni immutabili (plusDays, minusHours, withYear) che restituiscono un nuovo valore invece di modificare l'oggetto originale.

DateTimeFormatter: Formatta le date in formato moderno Java

DateTimeFormatter in java.time.format sostituisce SimpleDateFormatUtilizza lo stesso stile di lettere del modello, รจ immutabile ed รจ sicuro da condividere tra thread senza sincronizzazione aggiuntiva. La classe espone anche costanti predefinite come ISO_LOCAL_DATE and ISO_ZONED_DATE_TIME per formati standard.

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

class FormatterDemo {
    public static void main(String args[]) {
        LocalDateTime now = LocalDateTime.now();

        DateTimeFormatter iso = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
        DateTimeFormatter human = DateTimeFormatter.ofPattern("hh:mm:ss a dd-MMM-yyyy");

        System.out.println(now.format(iso));
        System.out.println(now.format(human));

        LocalDateTime parsed = LocalDateTime.parse("2026-07-04T09:30:00", iso);
        System.out.println("Parsed back : " + parsed);
    }
}

Per confrontare due date nell'API moderna, chiamare isBefore, isAfter, o isEqualQuesti metodi sono piรน chiari di compareTo e lavorare con ogni java.time classe.

Sicurezza dei fili e migliori pratiche per Java Data e ora

Entrambi i progetti editoriali di java.util.Date and SimpleDateFormat precedere il moderno contemporaneo Javae ognuna presenta delle insidie โ€‹โ€‹note. Segui le procedure descritte di seguito per gestire correttamente le date nel codice di produzione:

  • Preferisco java.time a Date e Calendar. I nuovi tipi sono immutabili e thread-safe, e modellano il dominio in modo piรน accurato (date senza orari, orari senza fusi orari e cosรฌ via).
  • Non condividere un oggetto SimpleDateFormat tra thread diversi. La classe memorizza lo stato di analisi interno e non รจ thread-safe. Avvolgila in un ThreadLocal, sincronizzare sull'istanza o passare a DateTimeFormatter.
  • Specificare sempre le impostazioni locali. I nomi dei mesi e dei giorni cambiano con le impostazioni locali predefinite della JVM, il che rende possibili modelli come MMM and EEE non portatile. Passa esplicitamente una locale (ad esempio, Locale.ENGLISH).
  • Siate espliciti riguardo ai fusi orari. LocalDateTime non ha zona, quindi converti in ZonedDateTime or Instant quando il momento preciso รจ importante, soprattutto per i log, le colonne del database e i payload di rete.
  • Convertire tra le due API con attenzione. Usa il date.toInstant(), Date.from(instant)e calendar.toInstant().atZone(zone) al confine tra codice legacy e codice moderno.
  • Memorizza i timestamp in formato UTC. Perseverare e transmit date come UTC (un Instant o una stringa ISO 8601) e convertire nella zona utente solo durante la visualizzazione.

DOMANDE FREQUENTI

Chiama LocalDateTime.now() dal pacchetto java.time per una data e un'ora nel fuso orario del sistema, oppure LocalDate.now() per una data soltanto. Su versioni precedenti Java, utilizzare new java.util.Date() per ottenere l'istante corrente.

`java.util.Date` rappresenta un istante in millisecondi dall'epoca e puรฒ essere modificato. `LocalDate` modella una data del calendario senza fuso orario, รจ immutabile e thread-safe e offre metodi piรน chiari come `plusDays` e `isBefore`.

No. SimpleDateFormat mantiene uno stato di analisi modificabile e produce risultati errati se condiviso tra thread. รˆ preferibile racchiuderlo in un ThreadLocal, sincronizzarlo sull'istanza oppure passare a DateTimeFormatter, che รจ immutabile e sicuro.

Inserisci la stringa esatta "yyyy-MM-dd". MM maiuscolo indica il mese, mm minuscolo indica il minuto. Per una data e un'ora complete, usa "yyyy-MM-dd HH:mm:ss". Specifica sempre le impostazioni locali (Locale) in modo che i nomi dei mesi siano riproducibili correttamente.

Con Date legacy, utilizzare compareTo che restituisce un intero negativo, zero o positivo. Con java.time, chiamare isBefore, isAfter o isEqual su un LocalDate o Instant. Entrambi gli approcci rispettano l'ordine cronologico.

Chiama date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(). Per tornare indietro, usa Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()). Seleziona esplicitamente il fuso orario quando รจ importante conoscere l'ora esatta.

I modelli di intelligenza artificiale addestrati su corpus di log e documenti deducono il modello piรน probabile da stringhe campione e restituiscono un modello DateTimeFormatter corrispondente. I classificatori di apprendimento automatico segnalano anche i campi ambigui, come ad esempio l'ordine mese-giorno rispetto a giorno-mese.

Sรฌ. GitHub Copilot suggerisce modelli DateTimeFormatter, conversioni ZonedDateTime e JUnit test per output sensibili alle impostazioni locali. RevPrima di confermare, controlla ogni suggerimento per verificare la correttezza delle lettere del modello, delle impostazioni locali e del fuso orario.

Riassumi questo post con: