Wie lassen sich die im Angelsächsischen üblichen Tageszeitkürzel AM und PM für eine gegebene Uhrzeit ermitteln?

Im englischen Sprachraum werden Zeiten üblicherweise in der 12-Stunden-Zählung angegeben und der vormittägliche und nachmittägliche Bereich durch AM (ante meridiem) und PM (post meridiem) gekennzeichnet. Bis Java 7 ermöglicht die Klasse Calendar die Ermittlung dieser Abkürzungen zu einem gegebenen Zeitpunkt. Ab Java 8 können hierfür auch die Klassen java.time.DateTime und java.time.format.DateTimeFormatter verwendet werden.

Bis Java 7

Das Vorgehen bis zur Java-Version 7 wird in der Methode amOrPm() demonstriert. Im Beispiel wird zunächst ein Objekt vom Typ GregorianCalendar erzeugt. Die Klasse unterstützt das gregorianische und julianische Kalendersystem gleichermaßen. Ihm wird wiederum ein Objekt der Klasse java.util.Date übergeben, das den aktuellen Zeitpunkt in Millisekunden-Genauigkeit repräsentiert. Er wird hierdurch mit dem aktuellen Kalender verknüpft.

Die abstrakte Klasse Calendar, von der GregorianCalendar abgeleitet ist, definiert eine Vielzahl an Konstanten (besser: finaler, statischer Variablen), die nun verwendet werden können, um die gewünschten Datums- und Zeitangaben zu ermitteln. Sie werden hierzu als Parameter der Methode get() des GregorianCalendar-Objektes übergeben.

Im Beispiel geschieht dies hier für die Tagesstunde in der 12-stündigen Angabe, die Minute und eben die AM/PM-Angabe. Ist die 24-Stunden-Angabe gewünscht, so muss statt Calendar.HOUR der Wert Calendar.HOUR_OF_DAY verwendet werden, selbstverständlich dann ohne AM/PM-Angabe.

import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class AMorPM {

    public static void main(String[] args) {
        amOrPm();
        amOrPmJava8();
    }

    private static void amOrPm() {
        GregorianCalendar cal = (GregorianCalendar) GregorianCalendar
                .getInstance();
        Date time = new Date();
        cal.setTime(time);
        int h = cal.get(Calendar.HOUR);
        int m = cal.get(Calendar.MINUTE);
        if (cal.get(Calendar.AM_PM) == Calendar.AM)
            System.out.println(h + ":" + m + "AM");
        else
            System.out.println(h + ":" + m + "PM");
    }

    private static void amOrPmJava8() {
        LocalTime time = LocalTime.now();
        DateTimeFormatter df = DateTimeFormatter.ofPattern("K:ma");
        System.out.println(time.format(df));
    }
}

Ab Java 8

v.8.0Die Methode amOrPmJava8() zeigt das Vorgehen ab der Java-Version 8, in der die gesamte Date-Time-API grundlegend umgestaltet wurde.
In diesem Fall wird der aktuelle Zeitpunkt in Form eines LocalTime-Objektes durch die statische Methode now() erzeugt und anschließend durch einen DateTimeFormatter formatiert. Hiezu wird zunächst ein solcher Formatierer mit Hilfe eines Zeichen-Musters erzeugt, das als Parameter der Methode ofPattern() übergeben wird. Das hier angegebene Muster K:ma erzeugt eine zusammengesetzte Ausgabe, bei der die beteiligten Zeichen folgendes bedeuten:

K AM/PM-Stunde 0 - 11
m Minute
a AM/PM-Angabe

Einen Überblick über alle für die Formatierung zur Verfügung stehenden Zeichen findet sich in den API Docs der Klasse DateTimeFormatter .