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.

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.
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:
| Brief | Datums- oder Zeitkomponente | Beispiel |
|---|---|---|
| G | Epochenbezeichner | AD |
| y | Jahr | 2026 |
| M | Monat im Jahr | Juli oder Juli oder 07 |
| w | Woche im Jahr | 27 |
| W | Woche im Monat | 2 |
| D | Tag im Jahr | 189 |
| d | Tag im Monat | 10 |
| F | Wochentag im Monat | 2 |
| E | Tagesname in der Woche | Dienstag oder Di |
| u | Tagesnummer der Woche (1 = Monday, 7 = Sonntag) | 1 |
| a | AM- oder PM-Markierung | PM |
| H | Stunde im Tag (0-23) | 0 |
| k | Stunde im Tag (1-24) | 24 |
| K | Stunde in AM oder PM (0-11) | 0 |
| h | Stunde in AM oder PM (1-12) | 12 |
| m | Minute in Stunde | 30 |
| s | Sekunde in Minute | 55 |
| S | Millisekunde | 978 |
| z | Zeitzone (Name) | Pazifische Standardzeit; PST; GMT-08:00 |
| Z | Zeitzone (RFC 822-Offset) | -0800 |
| X | Zeitzone (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:
- Erforderliches Datumsformat: 2012.10.23 20:20:45 PSTDas entsprechende Formatmuster ist
yyyy.MM.dd HH:mm:ss zzz. - 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
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:
LocalDatefรผr ein Datum ohne Zeitangabe oder Zeitzone (zum Beispiel ein Geburtstag).LocalTimefรผr eine Wanduhrzeit ohne Datums- oder Zeitzonenangabe.LocalDateTimefรผr ein Datum und eine Uhrzeit ohne Zeitzone.ZonedDateTimefรผr ein Datum und eine Uhrzeit mit einer bestimmten Zeitzone.OffsetDateTimefรผr ein Datum und eine Uhrzeit mit UTC-Offset, aber ohne benannte Zeitzone.Instantfรผr einen Maschinenzeitstempel, gemessen ab der UNIX-Epoche.DurationundPeriodfรผ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 wechselnDateTimeFormatter. - Geben Sie immer ein Gebietsschema an. Monats- und Tagesnamen รคndern sich mit dem Standard-JVM-Locale, was zu Mustern wie
MMMundEEEnicht portabel. Geben Sie explizit ein Gebietsschema an (zum Beispiel,Locale.ENGLISH). - Geben Sie die Zeitzonen genau an.
LocalDateTimehat keine Zone, also konvertieren zuZonedDateTimeorInstantImmer 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)undcalendar.toInstant().atZone(zone)an der Grenze zwischen Legacy-Code und modernem Code. - Speichere Zeitstempel in UTC. Durchhalten und transmit Datumsangaben als UTC (an
Instantoder eine ISO 8601-Zeichenfolge) und nur bei der Anzeige in die Benutzerzone konvertieren.


