Wie kann das aktuelle Datum ausgegeben und formatiert werden?

Bis Java 7 stellen die Klassen Date und GregorianCalendar zwei Möglichkeiten dar, um das aktuelle Datum auszugeben. Die Formatierung erfolgt durch die Klassen DateFormat und deren Ableitung SimpleDateFormat. Ab Java 8 wurde die API in erheblichem Maße geändert und insgesamt intuitiver gestaltet.

Bis Java 7

Im Beispiel werden zwei Methoden deklariert, die einen kleinen Einblick in die Themenstellung geben. die erste Methode printGregorianCalendarDate() demonstriert das Verfahren mit Hilfe der Klasse GregorianCalendar . Sie stellt eine Konkretion der abstrakten Klasse Calendar dar, die sehr umfangreiche Möglichkeiten bietet, um Zeit- und Datumsfelder zu manipulieren. Für weitere Informationen muss aufgrund des riesigen Umfangs der Möglichkeiten an dieser Stelle auf die Java Dokumentation verwiesen werden, die besonders im Kapitel GregorianCalendar zur Abwechslung auch einmal einige Beispiele aufführt.

In der u.a. Methode wird durch Aufruf des parameterlosen Konstruktors zunächst ein GregorianCalendar-Objekt erzeugt, das die aktuelle Zeit im Format der systemweiten Landeseinstellung repräsentiert. Um eine adäquate Formatierung zu erhalten wird die Klasse DateFormat verwendet, die eine Reihe statischer, teils überladener Methoden besitzt, um die Formatierer der einzelnen Zeit- und Datums-Felder zu erhalten. Diesen Methoden können statische int-Konstanten übergeben werden, die über die Teile und die genaue Formatierung der Ausgabe entscheiden. Die Basis bilden jedoch immer die durch die Landeseinstellungen und die Zeitzone festgelegte Formatierung.

Noch flexibler ist die Klasse SimpleDateFormat, mit deren Hilfe u.a. Datum-Strings nach eigenen Wünschen formatiert werden können. Wie im Beispiel in der Methode printSimpleDateFormat() gezeigt wird hierzu dem Konstruktor ein String übergeben, der mit Hilfe von Buchstaben-Patterns die genaue Formatierung bestimmt. Alle Patterns sind in der Dokumentation der Klasse SimpleDateFormat aufgeführt.
Auf dem SimpleDateFormatter-Objekt wird dessen Methode format() aufgerufen, dem als Parameter ein Objekt vom Typ Date übergeben wird.

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;

public class AktuellesDatum {

    static void printGregorianCalendarDate() {
        GregorianCalendar now = new GregorianCalendar();
        DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);   // 14.04.12
        df = DateFormat.getDateInstance(DateFormat.MEDIUM);             // 14.04.2012
        df = DateFormat.getDateInstance(DateFormat.LONG);               // 14. April 2012
        System.out.println(df.format(now.getTime()));
        df = DateFormat.getTimeInstance(DateFormat.SHORT);              // 21:21
        df = DateFormat.getTimeInstance(DateFormat.MEDIUM);             // 21:21:12
        df = DateFormat.getTimeInstance(DateFormat.LONG);               // 21:21:12 MESZ
        System.out.println(df.format(now.getTime()));
        df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.LONG); // 14.04.12 21:34:07 MESZ
        System.out.println(df.format(now.getTime()));
    }

    static void printSimpleDateFormat() {
        SimpleDateFormat formatter = new SimpleDateFormat(
                "yyyy.MM.dd - HH:mm:ss ");
        Date currentTime = new Date();
        System.out.println(formatter.format(currentTime));        // 2012.04.14 - 21:34:07 
    }

    public static void main(String[] args) {
        printGregorianCalendarDate();
        printSimpleDateFormat();
    }
}

Ab Java 8

v.8.0Ab Java 8 wurde die gesamte Date-Time-API erheblich umgestaltet. Hierbei wurden Konzepte der JODA-Bibliothek übernommen. Die Kernklassen sind nun im Package java.time enthalten, die Klassen zur Formatierung von Datum und Zeit im Package java.time.format.

Die folgende Beispielklasse demonstriert die Formatierung und Ausgabe des aktuellen Datums mit Hilfe der Java 8 API anhand zweier Methoden.
formatDateTime() zeigt die Formatierung eines LocalDateTime-Objektes, das über den Aufruf der statischen Methode now() mit dem aktuellen Zeitpunkt initialisiert wird. Es handelt sich dabei um ein Objekt das Datum und Zeit kombiniert in der ISO-8601-Form enthält.
Die Klasse DateTimeFormatter ist für die Formatierung zuständig. Sie enthält eine ganze Reihe vordefinierter statischer Formatierer, von denen einige hier gezeigt werden. Die Methode format() erledigt die eigentliche Formatierung. Sie ist in den drei Klassen LocalDateTime, LocalDate und LocalTime deklariert und erwartet jeweils einen Parameter vom Typ DateTimeFormatter.
Gesondert erwähnt werden muss hier die statische Methose ofPattern() der Klasse DateTimeFormatter. Sie nimmt einen String vorgegebener Musterzeichen entgegen, mit der die Formatierung exakt gesteuert werden kann. Einen Überblick über die hierfür zur Verfügung stehenden Zeichen findet sich in den API Docs der Klasse DateTimeFormatter .

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.time.LocalDate;

public class AktuellesDatumJava8 {

    static void formatDateTime() {
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter df;
        df = DateTimeFormatter.BASIC_ISO_DATE;    // 20160131
        df = DateTimeFormatter.ISO_LOCAL_DATE;    // 2016-18-31
        df = DateTimeFormatter.ISO_DATE_TIME;     // 2016-01-31T20:07:07.095
        System.out.println(now.format(df));       
        df = DateTimeFormatter.ofPattern("dd.MM.yyyy kk:mm");     // 31.01.2016 20:07
        System.out.println(now.format(df));     
    }
    
    static void formatDate() {
        LocalDate date = LocalDate.now();
        DateTimeFormatter df;
        System.out.println(date);      // 2016-01-31
        df = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL);      // Sonntag, 31. Januar 2016
        df = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG);      // 31. Januar 2016
        df = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM);    // 31.01.2016
        df = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT);     // 31.01.16
        System.out.println(date.format(df));
        
    }

    public static void main(String[] args) {
        formatDateTime();
        formatDate();
    }
}

In der Methode formatDate() wird ein Objekt vom Typ LocalDate erzeugt, das ein Datum ohne Zeitangaben enthält. Seine Formatierung erfolgt auf ähnliche Weise wie bei LocalDateTime. Im Beispiel werden einige Formatierungen mit Hilfe der Konstanten der Klasse FormatStyle demonstriert. Auch hier erfolgt die eigentliche Formatierung durch Aufruf der Methode format().

Tag, Monat und Jahr ermitteln

Zur Ermittlung der einzelnen Datumsbestandteile verfügt die Klasse LocalDate über Methoden zur Rückgabe der einzelnen Datumskomponenten

getDayOfWeek()
Liefert ein Objekt vom Typ DayOfWeek, dessen String-Repräsentation der englische Name des Wochentages ist. Den numerischen Wert erhält man durch getValue(), wobei 1 dem Montag und 7 dem Sonntag entsprechen.
getDayOfMonth()
Liefert den Tag im Monat
getDayOfYear()
Liefert den laufenden Tag im Jahr
getMonth()
Liefert ein Objekt vom Typ Month dessen String-Repräsentation der englische Monatsname ist. Mit getMonthValue() kann direkt vom LocalDate-Objekt der numerische Monatsbezeichner geholt werden. Die Ausgabe entspricht Month.getValue().
getYear()
Liefert die viestellige Jahreszahl
LocalDate currentDate = LocalDate.parse("2021-01-24");

DayOfWeek tagInWoche = currentDate.getDayOfWeek();
int tagImMonat = currentDate.getDayOfMonth();
int tagImJahr = currentDate.getDayOfYear();
Month monat = currentDate.getMonth();
int jahr = currentDate.getYear();

System.out.println("Aktuelles Datum: " + currentDate);        // Aktuelles Datum: 2021-01-24

System.out.println("Tag in Woche: " + tagInWoche);            // Tag in Woche: SUNDAY
System.out.println("Tag in Woche: " + tagInWoche.getValue()); // Tag in Woche: 7
System.out.println("Tag im Monat: " + tagImMonat);            // Tag im Monat: 24
System.out.println("Tag im Jahr: " + tagImJahr);              // Tag im Jahr: 24
System.out.println("Monat: " + monat);                        // Monat: JANUARY
System.out.println("Monat: " + monat.getValue());             // Monat: 1
System.out.println("Jahr: " + jahr);                          // Jahr: 2021

Regionalisierung

Zur Regionalisierung von Monats- und Wochentagsnamen stellen die Klassen Month und DayOfWeek die Methode getDisplayName(TextStyle style, Locale locale) bereit. Ihr werden zwei Argumente übergeben, von denen das erste das Ausgabeformat und das zweite die Angabe der Region bestimmt.

System.out.println("Wochentag: " + tagInWoche.getDisplayName(TextStyle.FULL, Locale.GERMANY));   // Wochentag: Sonntag
System.out.println("Wochentag: " + tagInWoche.getDisplayName(TextStyle.SHORT, Locale.GERMANY));  // Wochentag: So
System.out.println("Wochentag: " + tagInWoche.getDisplayName(TextStyle.NARROW, Locale.GERMANY)); // Wochentag: S
System.out.println("Wochentag: " + tagInWoche.getDisplayName(TextStyle.FULL, Locale.KOREAN));    // Wochentag: 일요일
System.out.println("Monat: " + monat.getDisplayName(TextStyle.FULL, Locale.GERMANY));            // Monat: Januar
System.out.println("Monat: " + monat.getDisplayName(TextStyle.FULL, Locale.CHINESE));            // Monat: 一月

Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.