Java Datum und Uhrzeit

โšก Intelligente Zusammenfassung

Java Die Datums- und Zeitverarbeitung kombiniert die รคlteren Klassen java.util.Date und SimpleDateFormat mit der modernen java.time-API, die in eingefรผhrt wurde. Java 8, wodurch Entwicklern unverรคnderliche, threadsichere Datentypen fรผr prรคzise Kalenderfunktionen zur Verfรผgung gestellt werden.

  • ๐Ÿ•’ Legacy-Datum: Die Klasse java.util.Date speichert einen Zeitpunkt in Millisekunden und gibt รผber toString eine Standardzeichenkette aus.
  • ๐Ÿ”ค Musterbuchstaben: SimpleDateFormat verwendet Buchstaben wie yyyy, MM, dd, HH, mm, ss und zzz, um benutzerdefinierte Ausgabeformate zu definieren.
  • ๏ธ Vergleich: Die compareTo-Methode gibt eine negative, null oder positive ganze Zahl zurรผck, um zwei Date-Instanzen chronologisch zu ordnen.
  • ๐Ÿ†• Moderne API: LocalDate, LocalDateTime, ZonedDateTime und Instant in java.time ersetzen Date und Calendar durch unverรคnderliche Objekte.
  • ๐Ÿงต Gewindesicherheit: DateTimeFormatter ist unverรคnderlich und kann sicher geteilt werden, wรคhrend SimpleDateFormat eine Synchronisierung oder einen ThreadLocal-Wrapper benรถtigt.
  • ๐Ÿ” Interoperabilitรคt: Konvertieren Sie zwischen der alten und der neuen API mithilfe der Hilfsfunktionen Date.toInstant, Date.from und Calendar.toInstant.

Java Datum und Uhrzeit

Umgang mit Datums- und Zeitangaben in Java ist ein routinemรครŸiger Bestandteil der Erstellung von Terminplanungslogik, Protokollierung von Zeitstempeln, Berichten und Prรผfprotokollen. Bevor man Code schreibt, ist es hilfreich, die Parameter zu kennen, aus denen sich ein Datum zusammensetzt:

  • Das Jahr (zwei- oder vierstellig).
  • Das Monat (als zwei Ziffern, als die ersten drei Buchstaben des Monats oder als der vollstรคndige Monatsname).
  • Das Datum (die tatsรคchliche Tagesnummer des Monats).
  • Das Tag (der Wochentag am angegebenen Datum, z. B. So, Mo, Di).

Java Es werden viele weitere Parameter offengelegt, die einen Zeitpunkt auf der Zeitachse beschreiben, darunter ร„ra, Kalenderwoche, Zeitzone und Offset. Die folgenden Abschnitte erlรคutern jeden dieser Parameter anhand von ausfรผhrbaren Beispielen.

So verwenden Sie Datum in Java

Datum anzeigen in Java

Java stellt ein Date Klasse in der java.util Das Paket enthรคlt eine Klasse, die einen bestimmten Zeitpunkt mit Millisekundengenauigkeit speichert und Hilfsmethoden zum Ausgeben, Vergleichen und Formatieren dieses Zeitpunkts bietet. Um das aktuelle Datum und die aktuelle Uhrzeit zu erhalten, instanziieren Sie die Klasse mit ihrem Standardkonstruktor:

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());
    }
}

Ausgang:

Wed Nov 29 06:36:22 UTC 2017

Das Beispiel gibt das Datum im Standardformat `toString` aus. Um denselben Zeitpunkt in einem anderen Format anzuzeigen, mรผssen Sie zunรคchst die Formatierungszeichen verstehen, die โ€ฆ Java verwendet.

SimpleDateFormat: Daten analysieren und formatieren

Das SimpleDateFormat Klasse in java.text konvertiert a Date ein Objekt in eine formatierte Zeichenkette umwandeln und eine formatierte Zeichenkette wieder in eine Zeichenkette parsen DateEs verwendet Musterbuchstaben, die einer Datums- oder Zeitkomponente zugeordnet sind. Die folgende Tabelle listet alle unterstรผtzten Buchstaben auf:

BriefDatums- oder ZeitkomponenteBeispiel
GEpochenbezeichnerAD
yJahr2026
MMonat im JahrJuli oder Juli oder 07
wWoche im Jahr27
WWoche im Monat2
DTag im Jahr189
dTag im Monat10
FWochentag im Monat2
ETagesname in der WocheDienstag oder Di
uTagesnummer der Woche (1 = Monday, 7 = Sonntag)1
aAM- oder PM-MarkierungPM
HStunde im Tag (0-23)0
kStunde im Tag (1-24)24
KStunde in AM oder PM (0-11)0
hStunde in AM oder PM (1-12)12
mMinute in Stunde30
sSekunde in Minute55
SMillisekunde978
zZeitzone (Name)Pazifische Standardzeit; PST; GMT-08:00
ZZeitzone (RFC 822-Offset)-0800
XZeitzone (ISO 8601-Offset)-08 oder -0800 oder -08:00

Sie mรผssen sich nicht die gesamte Tabelle merken. Schauen Sie einfach immer dann hinein, wenn Sie ein neues Muster erstellen.

Wie man SimpleDateFormat verwendet

SimpleDateFormat ist eine Unterklasse von DateFormat Damit kรถnnen Sie Datumsangaben mithilfe der oben genannten Musterbuchstaben formatieren und analysieren. Kombinieren Sie die Buchstaben, um die gewรผnschte Zeichenkette zu erzeugen oder zu lesen.

Beispielsweise:

  1. Erforderliches Datumsformat: 2012.10.23 20:20:45 PSTDas entsprechende Formatmuster ist yyyy.MM.dd HH:mm:ss zzz.
  2. Erforderliches Datumsformat: 09:30:00 AM 23-May-2012Das entsprechende Formatmuster ist hh:mm:ss a dd-MMM-yyyy.

TIPP: Beachten Sie die GroรŸ- und Kleinschreibung. GroรŸbuchstaben M ist Monat, Kleinbuchstaben m ist winzig. GroรŸbuchstabe H ist eine 24-Stunden-Uhr, kleingeschrieben h ist eine 12-Stunden-Uhr. Eine Verwechslung fรผhrt unbemerkt zu falschen Ergebnissen.

Das folgende Programm gibt das aktuelle Datum zweimal aus, einmal im Standardformat und einmal mithilfe eines SimpleDateFormat-Musters:

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));
    }
}

Ausgang:

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

Beispiel fรผr einen Datenvergleich

Beispiel fรผr einen Datenvergleich

Die zuverlรคssigste Methode, um zwei zu bestellen Date Objekte ist das compareTo() Die Methode gibt eine negative Ganzzahl zurรผck, wenn der Aufrufer frรผher liegt, null, wenn beide Zeitpunkte gleich sind, und eine positive Ganzzahl, wenn der Aufrufer spรคter liegt. Der folgende Codeausschnitt analysiert zwei Datumszeichenketten und gibt ihre relative Reihenfolge aus:

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");
        }
    }
}

Ausgang:

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

Hinweis: Der ursprรผngliche Code verwendete das Muster dd-mm-yyyy. Der Kleinbuchstabe mm Der Buchstabe steht fรผr Minute, nicht fรผr Monat, daher hat der Parser stillschweigend den falschen Monatswert ausgegeben. Die obige Korrektur verwendet GroรŸbuchstaben. MM fรผr Monat, welcher ist der richtige Musterbuchstabe?

Java 8 Moderne Datums- und Zeit-API (java.time)

Java 8 fรผhrte die java.time Das Paket bietet eine neu gestaltete API, die von der Joda-Time-Bibliothek inspiriert ist. Die neuen Klassen sind unverรคnderlich, threadsicher und trennen den menschlichen Kalender von der maschinellen Zeitleiste. Die hรคufigsten Typen sind:

  • LocalDate fรผr ein Datum ohne Zeitangabe oder Zeitzone (zum Beispiel ein Geburtstag).
  • LocalTime fรผr eine Wanduhrzeit ohne Datums- oder Zeitzonenangabe.
  • LocalDateTime fรผr ein Datum und eine Uhrzeit ohne Zeitzone.
  • ZonedDateTime fรผr ein Datum und eine Uhrzeit mit einer bestimmten Zeitzone.
  • OffsetDateTime fรผr ein Datum und eine Uhrzeit mit UTC-Offset, aber ohne benannte Zeitzone.
  • Instant fรผr einen Maschinenzeitstempel, gemessen ab der UNIX-Epoche.
  • Duration und Period fรผr zeit- und datumsbasierte Betrรคge.

Das folgende Beispiel gibt das aktuelle Datum, die Uhrzeit, den Zeitstempel und die Zeitzone mithilfe der modernen API aus:

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);
    }
}

Jeder Typ hat seine eigenen Fertigungsmethoden (now, of, parse) und unverรคnderliche Operationen (plusDays, minusHours, withYear) die einen neuen Wert zurรผckgeben, anstatt das ursprรผngliche Objekt zu verรคndern.

DateTimeFormatter: Datumsformatierung im modernen Format Java

DateTimeFormatter in java.time.format ersetzt SimpleDateFormatEs verwendet denselben Musterbuchstabenstil, ist unverรคnderlich und kann ohne zusรคtzliche Synchronisierung sicher zwischen Threads geteilt werden. Die Klasse stellt auรŸerdem vorgefertigte Konstanten wie beispielsweise โ€ฆ bereit. ISO_LOCAL_DATE und ISO_ZONED_DATE_TIME fรผr Standardformate.

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);
    }
}

Um zwei Datumsangaben in der modernen API zu vergleichen, rufen Sie Folgendes auf: isBefore, isAfterden isEqualDiese Methoden sind verstรคndlicher als compareTo und mit jedem zusammenarbeiten java.time Klasse.

Gewindesicherheit und bewรคhrte Verfahren fรผr Java Datum und Uhrzeit

Beides java.util.Date und SimpleDateFormat vor der modernen gleichzeitig JavaJede dieser Praktiken birgt bekannte Fallstricke. Befolgen Sie die folgenden Schritte, um die korrekte Datumsverarbeitung im Produktionscode sicherzustellen:

  • java.time ist Date und Calendar vorzuziehen. Die neuen Datentypen sind unverรคnderlich und threadsicher und bilden die Domรคne genauer ab (Datum ohne Uhrzeit, Uhrzeit ohne Zeitzone usw.).
  • Ein SimpleDateFormat sollte nicht threadรผbergreifend verwendet werden. Die Klasse speichert einen internen Parse-Status und ist nicht threadsicher. SchlieรŸen Sie sie in eine Klasse ein. ThreadLocal, auf der Instanz synchronisieren oder zu wechseln DateTimeFormatter.
  • Geben Sie immer ein Gebietsschema an. Monats- und Tagesnamen รคndern sich mit dem Standard-JVM-Locale, was zu Mustern wie MMM und EEE nicht portabel. Geben Sie explizit ein Gebietsschema an (zum Beispiel, Locale.ENGLISH).
  • Geben Sie die Zeitzonen genau an. LocalDateTime hat keine Zone, also konvertieren zu ZonedDateTime or Instant Immer dann, wenn es auf den genauen Zeitpunkt ankommt, insbesondere bei Protokollen, Datenbankspalten und Netzwerk-Payloads.
  • Die Konvertierung zwischen den beiden APIs muss sorgfรคltig erfolgen. Arbeiten jederzeit weiterbearbeiten kรถnnen. Jede Prรคsentation und jeder KI-Avatar, den Sie von Grund auf neu erstellen oder hochladen, date.toInstant(), Date.from(instant) und calendar.toInstant().atZone(zone) an der Grenze zwischen Legacy-Code und modernem Code.
  • Speichere Zeitstempel in UTC. Durchhalten und transmit Datumsangaben als UTC (an Instant oder eine ISO 8601-Zeichenfolge) und nur bei der Anzeige in die Benutzerzone konvertieren.

Hรคufig gestellte Fragen

Rufen Sie LocalDateTime.now() aus dem Paket java.time auf, um Datum und Uhrzeit in der Systemzeitzone zu erhalten, oder LocalDate.now() nur fรผr das Datum. Auf รคlteren JavaVerwenden Sie new java.util.Date(), um den aktuellen Zeitpunkt zu erhalten.

java.util.Date reprรคsentiert einen Zeitpunkt in Millisekunden seit der Unix-Epoche und ist verรคnderlich. LocalDate modelliert ein Kalenderdatum ohne Zeitangabe oder Zeitzone, ist unverรคnderlich und threadsicher und bietet รผbersichtlichere Methoden wie plusDays und isBefore.

Nein. SimpleDateFormat speichert einen verรคnderlichen Parse-Status und liefert falsche Ergebnisse, wenn es von mehreren Threads verwendet wird. Verwenden Sie stattdessen ein ThreadLocal-Objekt, synchronisieren Sie die Instanz oder wechseln Sie zu DateTimeFormatter, das unverรคnderlich und sicher ist.

รœbergeben Sie die exakte Zeichenkette โ€žyyyy-MM-ddโ€œ. GroรŸbuchstabe MM steht fรผr Monat, Kleinbuchstabe mm fรผr Minute. Fรผr Datum und Uhrzeit verwenden Sie โ€žyyyy-MM-dd HH:mm:ssโ€œ. Geben Sie immer ein Gebietsschema an, damit die Monatsnamen reproduzierbar bleiben.

Bei Verwendung von `Date` (รคlteres Format) verwenden Sie `compareTo`, das einen negativen, nullen oder positiven Integer-Wert zurรผckgibt. Bei `java.time` rufen Sie `isBefore`, `isAfter` oder `isEqual` fรผr `LocalDate` oder `Instant` auf. Beide Ansรคtze berรผcksichtigen die chronologische Reihenfolge.

Verwenden Sie `date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()`, um zum vorherigen Zeitpunkt zurรผckzukehren. Verwenden Sie dazu `Date.from(localDateTime(ZoneId.systemDefault()).toInstant())`. Wรคhlen Sie die Zeitzone explizit aus, wenn der genaue Zeitpunkt wichtig ist.

KI-Modelle, die anhand von Protokoll- und Dokumentenkorpora trainiert wurden, leiten aus Beispielzeichenketten das wahrscheinliche Muster ab und geben ein passendes DateTimeFormatter-Muster zurรผck. Klassifikatoren des maschinellen Lernens kennzeichnen zudem mehrdeutige Felder, beispielsweise die Reihenfolge Monat-Tag versus Tag-Monat.

Ja. GitHub Copilot schlรคgt DateTimeFormatter-Muster, ZonedDateTime-Konvertierungen und JUnit Tests fรผr lokalisierungsabhรคngige Ausgabe. RevBitte prรผfen Sie jeden Vorschlag auf die korrekten Musterbuchstaben, den Gebietsschema-Wert und die Zeitzone, bevor Sie ihn bestรคtigen.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: