12.01 Zeit in Java
Java bringt eine große Bibliothek für Zeit mit. In diesem Kapitel werden Sie mit der Klasse Date
und vertraut gemacht und lernen die Basisfunktionen dieser Klasse kennen. Dazu zählt die Ermittlung der aktuellen Systemzeit, das Prüfen, ob ein Zeitpunkt schon vergangen ist und die Formatierung eines Datums.
Die aktuelle Zeit des Systems
Zum Ermitteln der aktuellen Zeit muss nur eine Instanz von Date
erzeugt werden. Mit toString()
können Sie sich dann das Datum und die Uhrzeit ausgeben lassen:
package de.jbb.zeit import java.util.Date public class Main{ public static void main(String[] args){ Date date = new Date(); System.out.println(date.toString()); } }
Die Ausgabe lautet dann folgendermaßen:
Sun Feb 21 13:43:10 CET 2010
Es wird also der Wochentag angezeigt, danach der Monat und der Tag des Monats gefolgt von der aktuellen Uhrzeit, der Zeitzone (hier CET für Central European Time, dt. Mitteleuopäische Zeit) und des Jahres.
Einzelne Attribute ermitteln
Die einzelnen Attribute eines Datums lassen sich durch einfache get-Methoden ermitteln:
date.getSeconds(); // Sekunde in der Minute date.getMinutes(); // Minute in der Stunde date.getHours(); // Stunde am Tag date.getDay(); // Tag der Woche (Beginnt am Sonntag, d.h. Sonntag ist 0, Montag 1 usw.) date.getDate(); // Tag im Monat date.getMonth(); // Monat im Jahr (Beginnt mit 0, d.h. Januar ist 0, Februar 1 usw.) date.getYear(); // Jahr
Eine Besonderheit stellt die Methode getTime()
dar. Diese gibt die Anzahl der Millisekunden seit dem 1. Januar 1970 um 0 Uhr zurück. Anhand dieser Zahl werden alle anderen Attribute von Date berechnet. Wenn der Wert von getTime()
negativ ist, dann liegt das Datum vor dem 01.01.1970 0:0.0.
Werte setzen
Oft braucht man andere Datumswerte als das aktuelle Datum (Bsp.: Terminkalender). Dazu gibt es analog zu den o.g Gettern gleichlautende Setter. Sollten Sie einem Setter einen Wert übergeben, der größer ist als das logische Maximum des jeweiligen Attributes, dann nimmt Java Ihnen Arbeit ab und verändert die anderen Attribute mit. Wenn Sie also zum Beispiel der Methode setDate()
den Wert 30 übergeben, der Monat jedoch Februar ist, dann liefert toString()
den 2. März.
Dies ist möglich, da Date
den Wert, der Settern übergeben wird, in Millisekunden umwandelt und zum Wert von getTime()
addiert. Wenn wir einen Getter oder toString()
aufrufen, dann wird getTime()
entsprechend umgerechnet.
Eine Besonderheit besteht allerdings bei der Methode getYear()
. Diese Methode addiert auf den Eingangsparameter erst 1900, bevor sie ihn in Millisekunden umwandelt und verrechnet. Um also das Jahr 2011 zu setzen, muss der Methodenaufruf so lauten:
date.setYear(111);
Um ein Jahr vor 1900 zu setzen müssen Sie einen negativen Wert einsetzen. setYear(-192)
ergibt also das Jahr 1708.
Date-Objekte vergleichen
Zum Prüfen, ob ein Date-Objekt vor einem anderen ist, kann man entweder die getTime()
manuell vergleichen oder die beiden Methoden before(Date when)
und after(Date when)
benutzen:
Date date1 = new Date(); Date date2 = new Date(); date2.setDate(date1.getDate()-1); System.out.println("date1 liegt vor date2? " + date1.before(date2)); // false System.out.println("date1 liegt nach date2? " + date1.after(date2)); // true
Eine andere Möglichkeit bietet compareTo(Date anotherDate)
. Diese Methode gibt 0 zurück, wenn beide Date-Objekte dieselbe Zeit repräsentieren. Wenn das aufrufende Exemplar vor dem übergebenen Exemplar liegt, dann ist der Wert kleiner als 0, ansonsten größer als 0.
Date date1 = new Date(); Date date2 = new Date(); date2.setDate(date1.getDate()-1); if(date1.compareTo(date2) < 0){ System.out.println("date1 liegt vor date2."); } else if(date1.compareTo(date2) > 0){ System.out.println("date1 liegt nach date2."); } else{ System.out.println("date1 und date2 repräsentieren die selbe Zeit"); }
Ausgabe:
date1 liegt nach date2.
Date-Objekte formatieren
Die Ausgabe von toString()
ist zwar lesbar, aber nicht schön. Deshalb bietet Java eine Klassen zum Formatieren von Datumsangaben: SimpleDateFormat
. SimpleDateFormat
wird im Konstruktor ein Pattern (Muster) übergeben, nachdem es Datumsangaben formatiert. Um ein Datum zu formatieren wird dann die Methode format(Date date)
aufgerufen. Diese gibt das formatierte Datum als String zurück.
SimpleDateFormat simpleFormat = new SimpleDateFormat("DD.MM.yyyy"); Date date = new Date(); System.out.println(simpleFormat.format(date));
Die Ausgabe lautet:
21.02.2010
Bei vielen Pattern kommt es nicht auf die Groß- und Kleinschreibung an, ich empfehle dennoch dies zu beachten, da manche Buchstaben doppelt belegt sind. Beispielsweise stellt ein großes M den Monat dar, ein kleines jedoch die Minute. Hier die wichtigsten Pattern:
- y = Jahr
- yyyy = Jahr, vierstellig
- M = Monat im Jahr
- MMM = Monat im Jahr kurz (Bsp.: Dez)
- MMMM = Monate im Jahr lang (Bsp.: Dezember)
- D = Tag im Monat
- h = Stunde am Tag
- m = Minute in der Stunde
- s = Sekunde in der Minute
- E = Tag der Woche kurz (Bsp.: Mo)
- EEEE = Tag der Woche lang (Bsp.: Montag)
- ‚ = Zeichen für Text (Bsp.: „‚Am‘ DD ‚um‘ hh:mm ‚Uhr‘, Sonderzeichen müssen nicht in Hochkommata stehen)
Bei einstelligen Pattern, die eine Zahl repräsentieren (y, M, D, H) können Sie durch ein zweistelliges Schreiben der Pattern (z.B.: MM) eine zweistellige Anzeige erzwingen. So wird beispielsweise aus dem 1.1.3 ein 01.01.03.
Viel Date-Methoden sind deprecated
Bestimmt haben Sie schon bemerkt, dass der Compiler oder Ihre IDE Warnmeldungen ausgibt. Dies liegt daran, dass viele Methoden von Date
als deprecated
(dt. veraltet) gekennzeichnet sind und deshalb nicht mehr verwendet werden sollten. Seit der Java-Version 1.1 übernimmt die Klasse Calendar
bzw. GregorianCalendar
die Aufgaben von Date
. Die Funktionsweise ist aber oft ähnlich der von Date
. Auf die Unterschiede wird im nächsten Kapitel eingegangen.