Java Datum und Zeit meistern: Konstruktoren, Methoden & Best Practices
Java stellt die Date-Klasse im java.util-Paket bereit, die das aktuelle Datum und die aktuelle Zeit kapselt.
Die Date-Klasse unterstützt zwei Konstruktoren wie in der folgenden Tabelle gezeigt.
| Nr. | Konstruktor & Beschreibung |
|---|---|
| 1 | Date() Initialisiert das Objekt mit dem aktuellen Datum und der aktuellen Zeit. |
| 2 | Date(long millisec) Akzeptiert ein Argument, das der Anzahl der Millisekunden entspricht, die seit Mitternacht, 1. Januar 1970, verstrichen sind. |
Folgend die Methoden der Date-Klasse:
| Nr. | Methode & Beschreibung |
|---|---|
| 1 | boolean after(Date date) Gibt true zurück, wenn das aufrufende Date-Objekt ein späteres Datum enthält als das angegebene date, sonst false. |
| 2 | boolean before(Date date) Gibt true zurück, wenn das aufrufende Date-Objekt ein früheres Datum enthält als das angegebene date, sonst false. |
| 3 | Object clone() Dupliziert das aufrufende Date-Objekt. |
| 4 | int compareTo(Date date) Vergleicht den Wert des aufrufenden Objekts mit date. Gibt 0 zurück bei Gleichheit, negativen Wert wenn aufrufendes Objekt früher, positiven wenn später. |
| 5 | int compareTo(Object obj) Funktioniert identisch zu compareTo(Date), wenn obj der Klasse Date angehört. Andernfalls wirft es ClassCastException. |
| 6 | boolean equals(Object date) Gibt true zurück, wenn das aufrufende Date-Objekt dieselbe Zeit und dasselbe Datum wie das angegebene date enthält, sonst false. |
| 7 | long getTime() Gibt die Anzahl der Millisekunden zurück, die seit 1. Januar 1970 verstrichen sind. |
| 8 | int hashCode() Gibt einen Hash-Code für das aufrufende Objekt zurück. |
| 9 | void setTime(long time) Setzt Zeit und Datum wie durch time spezifiziert, was eine verstrichene Zeit in Millisekunden seit Mitternacht, 1. Januar 1970, repräsentiert. |
| 10 | String toString() Konvertiert das aufrufende Date-Objekt in einen String und gibt das Ergebnis zurück. |
Aktuelles Datum und Uhrzeit erhalten
Dies ist eine sehr einfache Methode, um aktuelles Datum und Uhrzeit in Java zu erhalten. Sie können ein einfaches Date-Objekt mit der toString()-Methode verwenden, um aktuelles Datum und Uhrzeit auszugeben:
Beispiel
Live Demoimport java.util.Date;
public class DateDemo {
public static void main(String args[]) {
// Date-Objekt instanziieren
Date date = new Date();
// Zeit und Datum mit toString() anzeigen
System.out.println(date.toString());
}
}
Dies produziert folgendes Ergebnis:
Ausgabe
on May 04 09:51:52 CDT 2009
Datumsvergleich
Folgend drei Wege, zwei Daten zu vergleichen:
- Verwenden Sie getTime(), um die Millisekunden seit 1.1.1970 für beide Objekte zu erhalten und diese zu vergleichen.
- Verwenden Sie before(), after() und equals(). Da der 12. des Monats vor dem 18. kommt, gibt z.B. new Date(99, 2, 12).before(new Date(99, 2, 18)) true zurück.
- Verwenden Sie compareTo(), definiert durch das Comparable-Interface und implementiert von Date.
Datumsformatierung mit SimpleDateFormat
SimpleDateFormat ist eine konkrete Klasse für Formatierung und Parsing von Datumsangaben in locale-sensitiver Weise. SimpleDateFormat erlaubt es, benutzerdefinierte Muster für Datumszeit-Formatierung zu wählen.
Beispiel
Live Demoimport java.util.*;
import java.text.*;
public class DateDemo {
public static void main(String args[]) {
Date dNow = new Date();
SimpleDateFormat ft = new SimpleDateFormat("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
System.out.println("Current Date: " + ft.format(dNow));
}
}
Dies produziert folgendes Ergebnis:
Ausgabe
Current Date: Sun 2004.07.18 at 04:14:09 PM PDT
SimpleDateFormat Format-Codes
Um das Zeitformat anzugeben, verwenden Sie einen Zeitmuster-String. In diesem Muster sind alle ASCII-Buchstaben als Musterbuchstaben reserviert, definiert als:
| Zeichen | Beschreibung | Beispiel |
|---|---|---|
| G | Era-Bezeichner | AD |
| y | Jahr in vier Ziffern | 2001 |
| M | Monat im Jahr | July oder 07 |
| d | Tag im Monat | 10 |
| h | Stunde in AM/PM (1~12) | 12 |
| H | Stunde im Tag (0~23) | 22 |
| m | Minute in Stunde | 30 |
| s | Sekunde in Minute | 55 |
| S | Millisekunde | 234 |
| E | Tag in Woche | Tuesday |
| D | Tag im Jahr | 360 |
| F | Wochentag im Monat | 2 (zweiter Mi. im Juli) |
| w | Woche im Jahr | 40 |
| W | Woche im Monat | 1 |
| a | AM/PM-Marker | PM |
| k | Stunde im Tag (1~24) | 24 |
| K | Stunde in AM/PM (0~11) | 10 |
| z | Zeitzone | Eastern Standard Time |
| ' | Escape für Text | Trennzeichen |
| " | Einfaches Anführungszeichen | ` |
Datumsformatierung mit printf
Datums- und Zeitformatierung kann sehr einfach mit der printf-Methode durchgeführt werden. Sie verwenden ein zweibuchstabiges Format, beginnend mit t und endend mit einem der Buchstaben der folgenden Tabelle.
Beispiel
Live Demoimport java.util.Date;
public class DateDemo {
public static void main(String args[]) {
Date date = new Date();
String str = String.format("Current Date/Time : %tc", date);
System.out.printf(str);
}
}
Dies produziert folgendes Ergebnis:
Ausgabe
Current Date/Time : Sat Dec 15 16:37:57 MST 2012
Es wäre etwas umständlich, das Datum mehrmals für jedes Format-Teil anzugeben. Deshalb kann ein Format-String den Index des zu formatierenden Arguments angeben.
Der Index muss unmittelbar dem % folgen und mit einem $ enden.
Beispiel
Live Demoimport java.util.Date;
public class DateDemo {
public static void main(String args[]) {
Date date = new Date();
System.out.printf("%1$s %2$tB %2$td, %2$tY", "Due date:", date);
}
}
Dies produziert folgendes Ergebnis:
Ausgabe
Due date: February 09, 2004
Alternativ können Sie das <-Flag verwenden. Es zeigt an, dass dasselbe Argument wie in der vorangegangenen Formatspezifikation erneut verwendet werden soll.
Beispiel
Live Demoimport java.util.Date;
public class DateDemo {
public static void main(String args[]) {
Date date = new Date();
System.out.printf("%s %tB %<te, %<tY", "Due date:", date);
}
}
Dies produziert folgendes Ergebnis:
Ausgabe
Due date: February 09, 2004
Datums- und Zeit-Konvertierungszeichen
| Zeichen | Beschreibung | Beispiel |
|---|---|---|
| c | Vollständiges Datum und Zeit | Mon May 04 09:51:52 CDT 2009 |
| F | ISO 8601 Datum | 2004-02-09 |
| D | US-formatiertes Datum (Monat/Tag/Jahr) | 02/09/2004 |
| T | 24-Stunden-Zeit | 18:05:19 |
| r | 12-Stunden-Zeit | 06:05:19 pm |
| R | 24-Stunden-Zeit, keine Sekunden | 18:05 |
| Y | Vierstelliges Jahr (mit führenden Nullen) | 2004 |
| y | Letzte zwei Ziffern des Jahres (mit führenden Nullen) | 04 |
| C | Erste zwei Ziffern des Jahres (mit führenden Nullen) | 20 |
| B | Vollständiger Monatsname | February |
| b | Abgekürzter Monatsname | Feb |
| m | Zweistelliger Monat (mit führenden Nullen) | 02 |
| d | Zweistelliger Tag (mit führenden Nullen) | 03 |
| e | Zweistelliger Tag (ohne führende Nullen) | 9 |
| A | Vollständiger Wochentagsname | Monday |
| a | Abgekürzter Wochentagsname | Mon |
| j | Dreistelliger Tag des Jahres (mit führenden Nullen) | 069 |
| H | Zweistellige Stunde (mit führenden Nullen), 00-23 | 18 |
| k | Zweistellige Stunde (ohne führende Nullen), 0-23 | 18 |
| I | Zweistellige Stunde (mit führenden Nullen), 01-12 | 06 |
| l | Zweistellige Stunde (ohne führende Nullen), 1-12 | 6 |
| M | Zweistellige Minuten (mit führenden Nullen) | 05 |
| S | Zweistellige Sekunden (mit führenden Nullen) | 19 |
| L | Dreistellige Millisekunden (mit führenden Nullen) | 047 |
| N | Neunstellige Nanosekunden (mit führenden Nullen) | 047000000 |
| P | Großgeschriebener AM/PM-Marker | PM |
| p | Kleingeschriebener AM/PM-Marker | pm |
| z | RFC 822 numerischer Offset von GMT | -0800 |
| Z | Zeitzone | PST |
| s | Sekunden seit 1970-01-01 00:00:00 GMT | 1078884319 |
| Q | Millisekunden seit 1970-01-01 00:00:00 GMT | 1078884319047 |
Es gibt weitere nützliche Klassen im Zusammenhang mit Datum und Zeit. Für Details verweisen Sie auf die Java Standard-Dokumentation.
Strings in Datumsangaben parsen
Die SimpleDateFormat-Klasse hat zusätzliche Methoden, insbesondere parse(), die versucht, einen String gemäß dem in dem gegebenen SimpleDateFormat-Objekt gespeicherten Format zu parsen.
Beispiel
Live Demoimport java.util.*;
import java.text.*;
public class DateDemo {
public static void main(String args[]) {
SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
String input = args.length == 0 ? "1818-11-11" : args[0];
System.out.print(input + " Parses as ");
Date t;
try {
t = ft.parse(input);
System.out.println(t);
} catch (ParseException e) {
System.out.println("Unparseable using " + ft);
}
}
}
Ein Beispiel-Lauf des obigen Programms würde folgendes Ergebnis produzieren:
Ausgabe
1818-11-11 Parses as Wed Nov 11 00:00:00 EST 1818
Für eine Weile schlafen
Sie können für jede Dauer von einer Millisekunde bis zur Lebensdauer Ihres Computers schlafen. Zum Beispiel würde das folgende Programm 3 Sekunden schlafen:
Beispiel
Live Demoimport java.util.*;
public class SleepDemo {
public static void main(String args[]) {
try {
System.out.println(new Date() + "\n");
Thread.sleep(5*60*10);
System.out.println(new Date() + "\n");
} catch (Exception e) {
System.out.println("Got an exception!");
}
}
}
Dies produziert folgendes Ergebnis:
Ausgabe
Sun May 03 18:04:41 GMT 2009 Sun May 03 18:04:51 GMT 2009
Verstrichene Zeit messen
Manchmal müssen Sie einen Zeitpunkt in Millisekunden messen. Lassen Sie uns das obige Beispiel neu schreiben:
Beispiel
Live Demoimport java.util.*;
public class DiffDemo {
public static void main(String args[]) {
try {
long start = System.currentTimeMillis();
System.out.println(new Date() + "\n");
Thread.sleep(5*60*10);
System.out.println(new Date() + "\n");
long end = System.currentTimeMillis();
long diff = end - start;
System.out.println("Difference is : " + diff);
} catch (Exception e) {
System.out.println("Got an exception!");
}
}
}
Dies produziert folgendes Ergebnis:
Ausgabe
Sun May 03 18:16:51 GMT 2009 Sun May 03 18:16:57 GMT 2009 Difference is : 5993
GregorianCalendar-Klasse
GregorianCalendar ist eine konkrete Implementierung einer Calendar-Klasse, die den normalen gregorianischen Kalender implementiert, mit dem Sie vertraut sind. Wir haben die Calendar-Klasse in diesem Tutorial nicht besprochen; Sie können die Standard-Java-Dokumentation dazu einsehen.
Die getInstance()-Methode von Calendar gibt einen GregorianCalendar zurück, initialisiert mit aktuellem Datum und Zeit in der Standard-Locale und Zeitzone. GregorianCalendar definiert zwei Felder: AD und BC. Diese repräsentieren die beiden Epochen, die durch den gregorianischen Kalender definiert sind.
Es gibt auch mehrere Konstruktoren für GregorianCalendar-Objekte:
| Nr. | Konstruktor & Beschreibung |
|---|---|
| 1 | GregorianCalendar() Erstellt einen Standard-GregorianCalendar mit aktueller Zeit in Standard-Zeitzone und Standard-Locale. |
| 2 | GregorianCalendar(int year, int month, int date) Erstellt GregorianCalendar mit gegebenem Datum in Standard-Zeitzone und Standard-Locale. |
| 3 | GregorianCalendar(int year, int month, int date, int hour, int minute) Erstellt GregorianCalendar mit gegebenem Datum und Zeit für Standard-Zeitzone und Standard-Locale. |
| 4 | GregorianCalendar(int year, int month, int date, int hour, int minute, int second) Erstellt GregorianCalendar mit gegebenem Datum und Zeit für Standard-Zeitzone und Standard-Locale. |
| 5 | GregorianCalendar(Locale aLocale) Erstellt GregorianCalendar basierend auf aktueller Zeit in Standard-Zeitzone mit gegebener Locale. |
| 6 | GregorianCalendar(TimeZone zone) |
| 7 | GregorianCalendar(TimeZone zone, Locale aLocale) Erstellt GregorianCalendar basierend auf aktueller Zeit in gegebener Zeitzone mit gegebener Locale. |
Hier ist eine Liste einiger nützlicher Support-Methoden der GregorianCalendar-Klasse:
| Nr. | Methode & Beschreibung |
|---|---|
| 1 | void add(int field, int amount) Fügt die angegebene (vorzeichenbehaftete) Zeitmenge zum gegebenen Zeitfeld hinzu, basierend auf den Kalenderregeln. |
| 2 | protected void computeFields() Konvertiert UTC als Millisekunden in Zeitfeldwerte. |
| 3 | protected void computeTime() Überschreibt Calendar: Konvertiert Zeitfeldwerte in UTC als Millisekunden. |
| 4 | boolean equals(Object obj) Vergleicht diesen GregorianCalendar mit einer Objektreferenz. |
| 5 | int get(int field) Gibt den Wert für ein gegebenes Zeitfeld zurück. |
| 6 | int getActualMaximum(int field) Gibt den Maximalwert zurück, den dieses Feld bei aktuellem Datum haben könnte. |
| 7 | int getActualMinimum(int field) Gibt den Minimalwert zurück, den dieses Feld bei aktuellem Datum haben könnte. |
| 8 | int getGreatestMinimum(int field) Gibt höchsten Minimalwert für gegebenes Feld zurück, falls variabel. |
| 9 | Date getGregorianChange() Gibt das GregorianCalendar-Änderungsdatum zurück. |
| 10 | int getLeastMaximum(int field) Gibt niedrigsten Maximalwert für gegebenes Feld zurück, falls variabel. |
| 11 | int getMaximum(int field) Gibt Maximalwert für gegebenes Feld zurück. |
| 12 | Date getTime() Gibt die aktuelle Zeit dieses Calendars zurück. |
| 13 | long getTimeInMillis() Gibt die aktuelle Zeit dieses Calendars als long zurück. |
| 14 | TimeZone getTimeZone() Gibt die Zeitzone zurück. |
| 15 | int getMinimum(int field) Gibt Minimalwert für gegebenes Feld zurück. |
| 16 | int hashCode() Überschreibt hashCode. |
| 17 | boolean isLeapYear(int year) Bestimmt, ob das gegebene Jahr ein Schaltjahr ist. |
| 18 | void roll(int field, boolean up) Addiert oder subtrahiert (up/down) eine einzelne Zeiteinheit auf gegebenem Zeitfeld ohne größere Felder zu ändern. |
| 19 | void set(int field, int value) Setzt das Zeitfeld mit dem gegebenen Wert. |
| 20 | void set(int year, int month, int date) Setzt Werte für Felder Jahr, Monat, Tag. |
| 21 | void set(int year, int month, int date, int hour, int minute) Setzt Werte für Jahr, Monat, Tag, Stunde, Minute. |
| 22 | void set(int year, int month, int date, int hour, int minute, int second) Setzt Werte für Jahr, Monat, Tag, Stunde, Minute, Sekunde. |
| 23 | void setGregorianChange(Date date) Setzt das GregorianCalendar-Änderungsdatum. |
| 24 | void setTime(Date date) Setzt die aktuelle Zeit dieses Calendars mit gegebenem Date. |
| 25 | void setTimeInMillis(long millis) Setzt die aktuelle Zeit dieses Calendars aus gegebenem long-Wert. |
| 26 | void setTimeZone(TimeZone value) Setzt die Zeitzone mit gegebenem Zeitzonenwert. |
| 27 | String toString() Gibt String-Repräsentation dieses Kalenders zurück. |
Beispiel
Live Demoimport java.util.*;
public class GregorianCalendarDemo {
public static void main(String args[]) {
String months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
int year;
// Gregorian Calendar erstellen, initialisiert mit aktuellem Datum/Zeit
GregorianCalendar gcalendar = new GregorianCalendar();
// Aktuelle Zeit- und Datumsinformationen anzeigen
System.out.print("Date: ");
System.out.print(months[gcalendar.get(Calendar.MONTH)]);
System.out.print(" " + gcalendar.get(Calendar.DATE) + " ");
System.out.println(year = gcalendar.get(Calendar.YEAR));
System.out.print("Time: ");
System.out.print(gcalendar.get(Calendar.HOUR) + ":");
System.out.print(gcalendar.get(Calendar.MINUTE) + ":");
System.out.println(gcalendar.get(Calendar.SECOND));
// Prüfen, ob aktuelles Jahr Schaltjahr ist
if(gcalendar.isLeapYear(year)) {
System.out.println("The current year is a leap year");
} else {
System.out.println("The current year is not a leap year");
}
}
}
Dies produziert folgendes Ergebnis:
Ausgabe
Date: Apr 22 2009 Time: 11:25:27 The current year is not a leap year
Für eine vollständige Liste der in der Calendar-Klasse verfügbaren Konstanten verweisen Sie auf die Standard-Java-Dokumentation.
Java
- C# Klassen & Objekte: Fundamente für robustes OOP
- Aktuelles Datum und Uhrzeit in Python abrufen: Praktischer Leitfaden
- Java Variablen und Literale: Umfassender Leitfaden
- Java Ausdrücke, Anweisungen und Blöcke verstehen
- Java Klassen und Objekte: Praktischer Leitfaden
- Java abstrakte Klassen und Methoden: Ein umfassender Leitfaden
- Java verschachtelte und innere Klassen meistern: Typen, Beispiele und Best Practices
- Java Singleton-Pattern erklärt: Sichere Implementierung und Verwendung
- Java throw vs. throws: Exception Handling mit praktischen Beispielen meistern
- Java Autoboxing und Unboxing meistern: Praktische Beispiele und Best Practices