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.

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.