Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.
 
Inhaltsverzeichnis
Vorwort
1 Neues in Java 8 und Java 7
2 Fortgeschrittene String-Verarbeitung
3 Threads und nebenläufige Programmierung
4 Datenstrukturen und Algorithmen
5 Raum und Zeit
6 Dateien, Verzeichnisse und Dateizugriffe
7 Datenströme
8 Die eXtensible Markup Language (XML)
9 Dateiformate
10 Grafische Oberflächen mit Swing
11 Grafikprogrammierung
12 JavaFX
13 Netzwerkprogrammierung
14 Verteilte Programmierung mit RMI
15 RESTful und SOAP-Web-Services
16 Technologien für die Infrastruktur
17 Typen, Reflection und Annotationen
18 Dynamische Übersetzung und Skriptsprachen
19 Logging und Monitoring
20 Sicherheitskonzepte
21 Datenbankmanagement mit JDBC
22 Java Native Interface (JNI)
23 Dienstprogramme für die Java-Umgebung
Stichwortverzeichnis

Jetzt Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Java SE 8 Standard-Bibliothek von Christian Ullenboom
Das Handbuch für Java-Entwickler
Buch: Java SE 8 Standard-Bibliothek

Java SE 8 Standard-Bibliothek
Pfeil 5 Raum und Zeit
Pfeil 5.1 Weltzeit *
Pfeil 5.2 Wichtige Datum-Klassen im Überblick
Pfeil 5.2.1 Der 1.1.1970
Pfeil 5.2.2 System.currentTimeMillis()
Pfeil 5.2.3 Einfache Zeitumrechnungen durch TimeUnit
Pfeil 5.3 Sprachen der Länder
Pfeil 5.3.1 Sprachen und Regionen über Locale-Objekte
Pfeil 5.4 Internationalisierung und Lokalisierung
Pfeil 5.4.1 ResourceBundle-Objekte und Ressource-Dateien
Pfeil 5.4.2 Ressource-Dateien zur Lokalisierung
Pfeil 5.4.3 Die Klasse ResourceBundle
Pfeil 5.4.4 Ladestrategie für ResourceBundle-Objekte
Pfeil 5.4.5 Ladeprozess und Format anpassen *
Pfeil 5.5 Die Klasse Date
Pfeil 5.5.1 Objekte erzeugen und Methoden nutzen
Pfeil 5.5.2 Date-Objekte sind nicht immutable
Pfeil 5.6 Calendar und GregorianCalendar
Pfeil 5.6.1 Die abstrakte Klasse Calendar
Pfeil 5.6.2 Calendar nach Date und Millisekunden fragen
Pfeil 5.6.3 Abfragen und Setzen von Datumselementen über Feldbezeichner
Pfeil 5.6.4 Kalender-Typen *
Pfeil 5.6.5 Kalender-Exemplare bauen über den Calendar.Builder
Pfeil 5.6.6 Wie viele Tage hat der Monat, oder wie viele Monate hat ein Jahr? *
Pfeil 5.6.7 Wann beginnt die Woche und wann die erste Woche im Jahr? *
Pfeil 5.6.8 Der gregorianische Kalender
Pfeil 5.7 Zeitzonen in Java *
Pfeil 5.7.1 Zeitzonen durch die Klasse TimeZone repräsentieren
Pfeil 5.7.2 SimpleTimeZone
Pfeil 5.7.3 Methoden von TimeZone
Pfeil 5.9 Formatieren und Parsen von Datumsangaben
Pfeil 5.9.1 Ausgaben mit printf(…)
Pfeil 5.9.2 Ausgaben mit Calendar-Methoden getDisplayName(…) *
Pfeil 5.9.3 Mit DateFormat und SimpleDateFormat formatieren
Pfeil 5.9.4 Parsen von Datumswerten
Pfeil 5.10 Date-Time-API in Java 8
Pfeil 5.10.1 Datumsklasse LocalDate
Pfeil 5.10.2 Ostertage *
Pfeil 5.10.3 Die Klasse YearMonth
Pfeil 5.10.4 Die Klasse MonthDay
Pfeil 5.10.5 Aufzählung DayOfWeek und Month
Pfeil 5.10.6 Klasse LocalTime
Pfeil 5.10.7 Klasse LocalDateTime
Pfeil 5.10.8 Klasse Year
Pfeil 5.10.9 Zeitzonen-Klassen ZoneId und ZoneOffset
Pfeil 5.10.10 Temporale Klassen mit Zeitzoneninformationen
Pfeil 5.10.11 Klassen Period und Duration
Pfeil 5.10.12 Klasse Instant
Pfeil 5.10.13 Parsen und Formatieren von Datumszeitwerten
Pfeil 5.10.14 Das Paket java.time.temporal *
Pfeil 5.10.15 Konvertierungen zwischen der klassischen API und Date-Time-API
Pfeil 5.11 Die Default-Falle
Pfeil 5.12 Zum Weiterlesen
 
Zum Seitenanfang

5.6Calendar und GregorianCalendar Zur vorigen ÜberschriftZur nächsten Überschrift

Ein Kalender unterteilt die Zeit in Einheiten wie Jahr, Monat, Tag. Der bekannteste Kalender ist der gregorianische Kalender, den Papst Gregor XIII. im Jahre 1582 einführte. Vor seiner Einführung war der julianische Kalender populär, der auf Julius Cäsar zurückging – daher auch der Name. Er stammt aus dem Jahr 45 vor unserer Zeitrechnung. Der gregorianische und der julianische Kalender sind Sonnenkalender, die den Lauf der Erde um die Sonne als Basis für die Zeiteinteilung nutzen; der Mond spielt keine Rolle. Daneben gibt es Mondkalender wie den islamischen Kalender und die Lunisolarkalender, die Sonne und Mond miteinander verbinden. Zu diesem Typus gehören der chinesische, der griechische und der jüdische Kalender.

Mit Exemplaren vom Typ Calendar ist es möglich, Datum und Uhrzeit in den einzelnen Komponenten wie Jahr, Monat, Tag, Stunde, Minute, Sekunde zu setzen und zu erfragen. Da es unterschiedliche Kalendertypen gibt, ist Calendar eine abstrakte Basisklasse, und Unterklassen bestimmen, wie konkret eine Abfrage oder Veränderung für ein bestimmtes Kalendersystem aussehen muss. Bisher bringt die Java-Bibliothek mit der Unterklasse GregorianCalendar nur eine öffentliche konkrete Implementierung mit, deren Exemplare Daten und Zeitpunkte gemäß dem gregorianischen Kalender verkörpern. Intern gibt es weiterhin eine Klasse für einen japanischen und eine für einen buddhistischen Kalender; sie werden immer verwendet, wenn die Locale ja_JP_JP bzw. th_TH sind.[ 64 ](http://docs.oracle.com/javase/8/docs/technotes/guides/intl/calendar.doc.html) IBM hat mit International Components for Unicode for Java (ICU4J) unter http://icu.sourceforge.net/ weitere Klassen wie ChineseCalendar, BuddhistCalendar, JapaneseCalendar, HebrewCalendar und IslamicCalendar freigegeben. Hier findet sich auch einiges zum Thema Ostertage.

 
Zum Seitenanfang

5.6.1Die abstrakte Klasse Calendar Zur vorigen ÜberschriftZur nächsten Überschrift

Die Klasse Calendar besitzt zum einen Anfrage- und Modifikationsmethoden für konkrete Exemplare und zum anderen statische Fabrikmethoden. Eine einfache statische Methode ist getInstance(), um ein konkretes Objekt zu bekommen.

abstract class java.util.Calendar
implements Serializable, Cloneable, Comparable<Calendar>
  • static Calendar getInstance()
    Liefert einen Standard-Calendar mit der Standardzeitzone und Standardlokalisierung zurück.

Neben der parameterlosen Variante von getInstance() gibt es drei weitere Varianten, denen ein TimeZone-Objekt und Locale-Objekt mit übergeben werden kann. Damit kann dann der Kalender auf eine spezielle Zeitzone und einen Landstrich zugeschnitten werden.

[»]Hinweis

Anders als Date hat Calendar (bzw. GregorianCalendar) keine menschenfreundliche toString()-Methode. Der String ist eher eine Debug-Meldung und listet alle Zustände des Objekts auf:

java.util.GregorianCalendar[time=1187732409256,areFieldsSet=true,areAllFieldsSet= …

Insgesamt gibt es drei Varianten, um an ein konkretes Calendar-Exemplar zu kommen:

  • Aufruf einer Fabrikmethode Calendar.getInstance(…)

  • Nutzen vom Calendar.Builder, was das Builder-Pattern realisiert

  • Nutzen einer Unterklasse von Calendar, etwa GregorianCalendar

 
Zum Seitenanfang

5.6.2Calendar nach Date und Millisekunden fragen Zur vorigen ÜberschriftZur nächsten Überschrift

Um von einem Calendar die Anzahl der vergangenen Millisekunden seit dem 1.1.1970 abzufragen, dient getTimeInMillis() (eine ähnliche Methode hat auch Date, nur heißt sie dort getTime()).

[»]Hinweis

Calendar und Date haben beide eine getTime()-Methode. Nur liefert die Calendar-Methode getTime() ein java.util.Date-Objekt und die Date-Methode getTime() ein long. Gutes API-Design sieht anders aus. Damit Entwickler aber keine unschönen cal.getTime().getTime()-Ausdrücke schreiben müssen, um vom Calendar die Anzahl der Millisekunden zu beziehen, ist getTimeInMillis() im Angebot.

abstract class java.util.Calendar
implements Serializable, Cloneable, Comparable<Calendar>
  • final long getTimeInMillis()
    Liefert die seit der Epoche (January 1, 1970 00:00:00.000 GMT, Gregorian) vergangene Zeit in Millisekunden.

  • final Date getTime()
    Liefert ein Date-Objekt zu diesem Calendar.

[zB]Beispiel

Bestimme die Anzahl der Tage, die seit einem bestimmten Tag, Monat und Jahr vergangen sind:

int date = 1;
int month = Calendar.JANUARY;
int year = 1900;
long ms = new GregorianCalendar( year, month, date ).getTimeInMillis();
long days = TimeUnit.MILLISECONDS.toDays( System.currentTimeMillis() – ms );
System.out.println( days ); // 40303

Zum Aufbau eines Calendar-Objekts nutzt das Beispiel den parametrisieren Konstruktor von GregorianCalendar.

 
Zum Seitenanfang

5.6.3Abfragen und Setzen von Datumselementen über Feldbezeichner Zur vorigen ÜberschriftZur nächsten Überschrift

Das Abfragen und Setzen von Datumselementen eines Kalenders erfolgt mit den überladenen Methoden get(…) und set(…). Beide erwarten als erstes Argument einen Feldbezeichner – eine Konstante aus der Klasse Calendar –, der angibt, auf welches Datum-/Zeitfeld zugegriffen werden soll. Die get(…)-Methode liefert den Inhalt des angegebenen Feldes, und set(…) schreibt den als zweites Argument übergebenen Wert in das Feld.

[zB]Beispiel

Führe Anweisungen aus, wenn es 19 Uhr ist:

if ( Calendar.getInstance().get( Calendar.HOUR_OF_DAY ) == 19 )

Tabelle 5.1 gibt eine Übersicht der Feldbezeichner und ihrer Wertebereiche im Fall des konkreten GregorianCalendar:

abstract class java.util.Calendar
implements Serializable, Cloneable, Comparable<Calendar>

Feldbezeichner
Calendar.*

Minimalwert

Maximalwert

Erklärung

ERA

0 (BC)

1 (AD)

Datum vor oder nach Christus

YEAR

1

theoretisch unbeschränkt

Jahr

MONTH

0

11

Monat (nicht von 1 bis 12!)

DAY_OF_MONTH
alternativ DATE

1

31

Tag

WEEK_OF_YEAR

1

54

Woche

WEEK_OF_MONTH

1

6

Woche des Monats

DAY_OF_YEAR

1

366

Tag des Jahres

DAY_OF_WEEK

1

7

Tag der Woche
(1 = Sonntag, 7 = Samstag)

DAY_OF_WEEK_IN_MONTH

1

6

Tag der Woche im Monat

HOUR

0

11

Stunde von 12

HOUR_OF_DAY

0

23

Stunde von 24

MINUTE

0

59

Minute

SECOND

0

59

Sekunden

MILLISECOND

0

999

Millisekunden

AM_PM

0

1

vor 12, nach 12

ZONE_OFFSET

13 × 60 × 60 × 1000

+14 × 60 × 60 × 1000

Zeitzonenabweichung in Millisekunden

DST_OFFSET

0

2 × 60 × 60 × 1000

Sommerzeitabweichung in Millisekunden

Tabelle 5.1Konstanten aus der Klasse Calendar

Beachtenswert sind der Anfang der Monate mit 0 und der Anfang der Wochentage mit 1 (SUNDAY), 2 (MONDAY), …, 7 (SATURDAY) – Konstanten der Klasse Calendar stehen in Klammern. Die Woche beginnt in der Java-Welt also bei 1 und Sonntag, statt – wie vielleicht anzunehmen – bei 0 und Montag.

[zB]Beispiel

Ist ein Date-Objekt gegeben, so speichert es Datum und Zeit. Soll der Zeitanteil gelöscht werden, so bietet Java dafür keine eigene Methode. Die Lösung ist, Stunden, Minuten, Sekunden und Millisekunden von Hand auf 0 zu setzen. Löschen wir vom Hier und Jetzt die Zeit:

Date date = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime( date );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 0 );
date = cal.getTime();

Eine Alternative wäre, den Konstruktor GregorianCalendar(int year, int month, int dayOfMonth) mit den Werten vom Datum zu nutzen.

abstract class java.util.Calendar
implements Serializable, Cloneable, Comparable<Calendar>
  • int get(int field)
    Liefert den Wert für field.

  • void set(int field, int value)
    Setzt das Feld field mit dem Wert value.

  • final void set(int year, int month, int date)
    Setzt die Werte für Jahr, Monat und Tag.

  • final void set(int year, int month, int date, int hourOfDay, int minute)
    Setzt die Werte für Jahr, Monat, Tag, Stunde und Minute.

  • final void set(int year, int month, int date, int hourOfDay, int minute, int second)
    Setzt die Werte für Jahr, Monat, Tag, Stunde, Minute und Sekunde.

[»]Hinweis

Wo die Date-Klasse etwa spezielle (veraltete) Methoden wie getYear(), getDay(), getHours() anbietet, müssen Nutzer der Calendar-Klasse immer die get(int field)-Methode nutzen. Es gibt kaum Getter für den Zugriff auf ein bestimmtes Feld.

Werte relativ setzen

Neben der Möglichkeit, die Werte entweder über den Konstruktor oder über set(…) absolut zu setzen, sind auch relative Veränderungen möglich. Dazu wird die add(…)-Methode eingesetzt, die wie set(…) als erstes Argument einen Feldbezeichner bekommt und als zweites die Verschiebung.

[zB]Beispiel

Was ist der erste und letzte Tag einer Kalenderwoche?

Calendar cal = Calendar.getInstance();
cal.set( Calendar.YEAR, 2014 );
cal.set( Calendar.WEEK_OF_YEAR, 15 );
cal.set( Calendar.DAY_OF_WEEK, Calendar.MONDAY );
System.out.printf( "%tD ", cal ); // 04/07/14
cal.add( Calendar.DAY_OF_WEEK, 6 );
System.out.printf( "%tD", cal ); // 04/13/14

Die Methode add(…) setzt das Datum um 6 Tage hoch.

Da es keine sub(…)-Methode gibt, können die Werte bei add(…) auch negativ sein.

[zB]Beispiel

Wo waren wir heute vor einem Jahr?

Calendar cal = Calendar.getInstance();
System.out.printf( "%tF%n", cal ); // 2013-02-01
cal.add( Calendar.YEAR, -1 );
System.out.printf( "%tF%n", cal ); // 2012-02-01

Eine weitere Methode roll(…) ändert keine folgenden Felder, was add(…) macht, wenn etwa zum 30. eines Monats 10 Tage addiert werden.

abstract class java.util.Calendar
implements Serializable, Cloneable, Comparable<Calendar>
  • abstract void add(int field, int amount)
    Addiert (bzw. subtrahiert, wenn amount negativ ist) den angegebenen Wert auf dem (bzw. vom) Feld.

  • abstract void roll(int field, boolean up)
    Setzt eine Einheit auf dem gegebenen Feld hoch oder runter, ohne die nachfolgenden Felder zu beeinflussen. Ist der aktuelle Feldwert das Maximum (bzw. Minimum) und wird um eine Einheit addiert (bzw. subtrahiert), ist der nächste Feldwert das Minimum (bzw. Maximum).

  • void roll(int field, int amount)
    Ist amount positiv, führt diese Methode die Operation roll(field, true) genau amount-mal aus, ist amount negativ, dann wird amount-mal roll(field, false) aufgerufen.

 
Zum Seitenanfang

5.6.4Kalender-Typen * Zur vorigen ÜberschriftZur nächsten Überschrift

Welchen Kalendertyp ein konkreter Kalender repräsentiert, ermittelt ab Java 8 die Calendar-Objektmethode getCalendarType(); die Rückgabe ist ein String und lautet bei dem typischen gregorianischen Kalender »gregory«, könnte aber auch »buddhist« oder »japanese« heißen. Welche Kalendertypen Java überhaupt unterstützt, liefert die statische Methode Calendar.getAvailableCalendarTypes() in Java 8 als Set<String>. Im Moment sind es genau die drei genannten.

 
Zum Seitenanfang

5.6.5Kalender-Exemplare bauen über den Calendar.Builder Zur vorigen ÜberschriftZur nächsten Überschrift

Java 8 hat in Calendar die neue statische innere Klasse Builder eingeführt, mit der sich leicht Calendar-Exemplare mit gesetzten Feldern aufbauen lassen. Die allgemeine Schreibweise ist wie folgt:

Calendar cal = new Calendar.Builder()
.setXXX( … ).setXXX( … ).setXXX( … )
.build();

Zum Setzen von Feldern gibt es setXXX(…)-Methoden, am Ende folgt ein Aufruf von build(), der ein fertiges Calendar-Objekt liefert.

static class java.util.Calendar.Builder
  • Calendar.Builder setDate(int year, int month, int dayOfMonth)

  • Calendar.Builder set(int field, int value)

  • Calendar.Builder setFields(int... fieldValuePairs)

  • Calendar.Builder setInstant(Date instant)

  • Calendar.Builder setInstant(long instant)

  • Calendar.Builder setTimeOfDay(int hourOfDay, int minute, int second)

  • Calendar.Builder setTimeOfDay(int hourOfDay, int minute, int second, int millis)

  • Calendar.Builder setWeekDate(int weekYear, int weekOfYear, int dayOfWeek)

  • Calendar.Builder setTimeZone(TimeZone zone)

Etwas weniger gebräuchliche Methoden sind weiterhin setCalendarType(String type) – was Rückgaben von Calendar.getAvailableCalendarTypes() erlaubt und alternativ zu »gregory« auch »gregorian« bzw. »iso8601« –, setLenient(boolean lenient), setLocale(Locale locale) und setWeekDefinition(int firstDayOfWeek, int minimalDaysInFirstWeek).

 
Zum Seitenanfang

5.6.6Wie viele Tage hat der Monat, oder wie viele Monate hat ein Jahr? * Zur vorigen ÜberschriftZur nächsten Überschrift

Das Calendar Objekt kann nicht nur nach einem bestimmen Element, etwa dem Tag oder dem Jahr, abgefragt werden, sondern auch nach Bereichen der Elemente, etwa wie viele Tage maximal in einem Monat sind oder nach dem Start der Woche.

Fragen nach dem ersten/letzten bzw. größten/kleinsten Element lassen sich mit unterschiedlichen Methoden getXXXMinimum(…), getXXXMaximum(…) klären. Als Argument bekommt diese Methode einen Feldbezeichner aus der Klasse Calendar übermittelt, dessen Maximum sie dann bestimmt.

Das nachfolgende Programm listet alle Monate des aktuellen Kalenders auf. Zwar umfasst der gregorianische Kalender genau 12 Monate, trotzdem ist die Grenze nicht bei Calendar. DECEMBER gesetzt, sondern dynamisch erfragt. Den Beweis, dass das Programm korrekt funktioniert, sollten wir mit einem Abzählen der Fingerknöchel führen:

Listing 5.10com/tutego/insel/date/Knuckles.java, main()

Calendar cal = Calendar.getInstance();

System.out.println( cal.getTime() );

for ( int month = Calendar.JANUARY;
month <= cal.getActualMaximum( Calendar.MONTH );
month++ ) {
cal.set( Calendar.MONTH, month );

System.out.printf( "%d. Monat hat %d Tage%n", month + 1,
cal.getActualMaximum(Calendar.DAY_OF_MONTH) );
}

Die Ausgabe:

Sat Apr 16 11:31:38 CEST 2011
1. Monat hat 31 Tage
2. Monat hat 28 Tage
3. Monat hat 31 Tage
4. Monat hat 30 Tage
5. Monat hat 31 Tage
6. Monat hat 30 Tage
7. Monat hat 31 Tage
8. Monat hat 31 Tage
9. Monat hat 30 Tage
10. Monat hat 31 Tage
11. Monat hat 30 Tage
12. Monat hat 31 Tage

Die Methoden im Überblick:

abstract class java.util.Calendar
implements Serializable, Cloneable, Comparable<Calendar>
  • abstract int getMinimum(int field)

  • abstract int getMaximum(int field)
    Liefert den kleinsten/größten Wert, den das Kalenderfeld grundsätzlich annehmen kann.

  • int getActualMinimum(int field)

  • int getActualMaximum(int field)
    Liefert den kleinsten/größten Wert, den das Kalenderfeld bei dem aktuellen Kalenderexemplar annehmen kann. Der Februar 2010 hat zum Beispiel 28 Tage, der Februar 2012 aber 29. Demnach ist das Ergebnis je nach Jahr unterschiedlich, getMaximum(…) wäre aber immer gleich.

  • abstract int getGreatestMinimum(int field)

  • abstract int getLeastMaximum(int field)
    Liefert den größten/kleinsten Wert von getActualMinimum(int)/getActualMaximum(int) für alle möglichen gültigen Kalender.

 
Zum Seitenanfang

5.6.7Wann beginnt die Woche und wann die erste Woche im Jahr? * Zur vorigen ÜberschriftZur nächsten Überschrift

Die Konstante Calendar.SUNDAY definiert mit 1 den Start der Woche. Das ist insbesondere für deutsche Verhältnisse unüblich, denn nach DIN-Norm 1355 beginnt die Woche mit Montag. Die Vereinbarung wurde 1975 mit der ISO getroffen und von den Kalenderherstellern in den folgenden Jahren umgesetzt. Wer »weltliche« Software schreibt, sollte jedoch berücksichtigen, dass die katholische und evangelische Kirche sich dieser Anpassung nicht angeschlossen haben: Sonntag bleibt der erste Tag der Woche.

Da der offizielle Start der Woche in den einzelnen Ländern unterschiedlich ist, bietet die Calendar-Klasse die Methode getFirstDayOfWeek().

[zB]Beispiel

An welchem Tag beginnt die Woche?

Calendar cal = Calendar.getInstance( Locale.GERMANY );
System.out.println( cal.getFirstDayOfWeek() ); // 2 = MONDAY
cal = Calendar.getInstance( Locale.US );
System.out.println( cal.getFirstDayOfWeek() ); // 1 = SUNDAY
cal = Calendar.getInstance( Locale.FRANCE );
System.out.println( cal.getFirstDayOfWeek() ); // 2 = MONDAY

Liegt der 1.1. immer in der der KW 1?

Zwar beginnt das Jahr immer am 1.1., allerdings nicht immer mit einem Sonntag oder Montag, also dem Tag, der laut getFirstDayOfWeek() die Woche beginnen lässt. Der 1.1.2011 war ein Samstag, der 1.1.2012 ein Sonntag und der 1.1.2013 ein Dienstag. Da der 1.1. eine neue Woche beginnen lässt, ergibt sich die interessante Fragestellung, ob der 1.1. denn immer in der KW 1 liegen muss oder nicht. Die Antwort liefert das Wochennummerierungssystem und das ist – wie so vieles in Deutschland – in einer DIN-Norm geregelt. Damit der 1.1. in der KW 1 liegt, müssen in Deutschland mindestens 4 Tage in dieser ersten Woche liegen. Ist es zum Beispiel nur 1 Tag, so liegt der 1.1. in der letzten KW des vorherigen Jahres, etwa in der KW 52. Da in Deutschland die Woche am Montag beginnt, heißt das bei 4 Tagen: Wenn der 1.1. am Montag, Dienstag, Mittwoch oder Donnerstag liegt, gehört er zur KW 1, andernfalls nicht.

Wer Kalender anzeigt und die Kalenderwochen einträgt, der muss so etwas wissen. In Deutschland beträgt die Grenze 4 Tage, aber das ist landesabhängig. Und genau für diesen Fall bietet die Calendar-Klasse eine Methode getMinimalDaysInFirstWeek(). Für Deutschland liefert sie 4, aber für viele andere Länder gibt sie 1 zurück.

[zB]Beispiel

Rückgabe von getMinimalDaysInFirstWeek() in verschiedenen Ländern:

Calendar cal = Calendar.getInstance( Locale.GERMANY );
System.out.println( cal.getMinimalDaysInFirstWeek() ); // 4
cal = Calendar.getInstance( Locale.US );
System.out.println( cal.getMinimalDaysInFirstWeek() ); // 1
cal = Calendar.getInstance( Locale.CANADA_FRENCH );
System.out.println( cal.getMinimalDaysInFirstWeek() ); // 1

Die Methode getWeeksInWeekYear() sagt bei einem gesetzten Feld für die Kalenderwoche, wie viele Wochen das Jahr maximal hat. GregorianCalendar unterstützt die Methode, doch nicht jeder Calendar muss das tun.

 
Zum Seitenanfang

5.6.8Der gregorianische Kalender Zur vorigen ÜberschriftZur nächsten Überschrift

Die Klasse GregorianCalendar erweitert die abstrakte Klasse Calendar. Sieben Konstruktoren stehen zur Verfügung; vier davon sehen wir uns an.

class java.util.GregorianCalendar
extends Calendar
  • GregorianCalendar()
    Erzeugt ein standardmäßiges GregorianCalendar-Objekt mit der aktuellen Zeit in der voreingestellten Zeitzone und Lokalisierung.

  • GregorianCalendar(int year, int month, int date)
    Erzeugt ein GregorianCalendar-Objekt in der voreingestellten Zeitzone und Lokalisierung. Jahr, Monat (der zwischen 0 und 11 und nicht zwischen 1 und 12 liegt) und Tag legen das Datum fest.

  • GregorianCalendar(int year, int month, int date, int hour, int minute)
    Erzeugt ein GregorianCalendar-Objekt in der voreingestellten Zeitzone und Lokalisierung. Das Datum legen Jahr, Monat (0 <= month <= 11 ), Tag, Stunde und Minute fest.

  • GregorianCalendar(int year, int month, int date, int hour, int minute, int second)
    Erzeugt ein GregorianCalendar-Objekt in der voreingestellten Zeitzone und Lokalisierung. Das Datum legen Jahr, Monat (0 <= month <= 11), Tag, Stunde, Minute und Sekunde fest.

[»]Hinweis

Die Monate beginnen bei 0, sodass new GregorianCalendar(1973, 3, 12) nicht den 12. März, sondern den 12. April ergibt! Damit Anfrageprobleme vermieden werden, sollten die Calendar-Konstanten JANUARY (0), FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER (11) verwendet werden. Die spezielle Variable UNDECIMBER (12) steht für den 13. Monat, der etwa bei einem Mondkalender anzutreffen ist. Die Konstanten sind keine typsicheren Aufzählungen, bieten aber den Vorteil, als int einfach mit ihnen zählen zu können.

Neben den hier aufgeführten Konstruktoren gibt es noch weitere, die es erlauben, die Zeitzone und Lokalisierung zu ändern. Standardmäßig eingestellt sind die lokale Zeitzone und die aktuelle Lokalisierung. Ist eines der Argumente im falschen Bereich, löst der Konstruktor eine IllegalArgumentException aus.

[»]Hinweis

Zum Aufbau von Calendar-Objekten gibt es nun zwei Möglichkeiten:

Calendar c = Calendar.getInstance();

und

Calendar c = new GregorianCalendar();

Die erste Variante ist besonders in internationalisierter Software zu bevorzugen, da es einige Länder gibt, die nicht nach dem gregorianischen Kalender arbeiten.

Calendar c = Calendar.getInstance( new Locale("ja", "JP", "JP") );

Fehlerquelle: Der Standard-Konstruktor setzt eine falsche Zeitzone *

Leider liefert der Standard-Konstruktor von GregorianCalendar nicht immer die erwarteten Ergebnisse. Zur Klärung sehen wir uns die Implementierung genauer an:

public GregorianCalendar() {
this( TimeZone.getDefault(), Locale.getDefault() );
}

Konstruieren wir den gregorianischen Kalender ohne Zeitzonenangabe, so ruft die Klasse TimeZone die statische Methode getDefault() auf. Die Implementierung von getDefault() fragt nach einer Systemeigenschaft user.timezone. Sie lässt sich

  1. programmatisch mit System.setProperty("user.timezone","Zeitzone"); oder

  2. mit -Duser.timezone=Zeitzone über die Kommandozeile setzen.

Ist die user.timezone-Variable nicht explizit gesetzt, nimmt der Kalender die Zeitzone 0 an. In Deutschland haben wir jedoch die Central European Time (CET). Ist die Zeitzone auf Rechnern nicht auf CET gestellt, gehen alle Zeitangaben eine Stunde nach. Um dieses Problem zu beheben, sollte die korrekte Zeitzone mit dem Konstruktor GregorianCalendar(TimeZone) oder mit der Methode setTimeZone(TimeZone) aus der Klasse Calendar eingestellt werden:

calendar = new GregorianCalendar();
calendar.setTimeZone( TimeZone.getTimeZone("CET") );

[»]Hinweis

Natürlich verfehlt dies vollkommen seinen Zweck, da wir die Zeitzone nicht von Hand setzen sollten. Aber leider funktioniert es auf einigen Computern nicht ohne explizites Setzen.

Ein gregorianischer Kalender mit eigenen Werten *

Wir wollen im folgenden Beispiel ein Calendar-Objekt erzeugen und mit einer selbst geschriebenen statischen Methode printCalendar(Calendar) wichtige Felder ausgeben. Weil die Daten nicht bearbeitet werden, handelt es sich um das aktuelle Tagesdatum. Anschließend manipulieren wir mit den set(…)-Methoden das Objekt und setzen es auf das Geburtsdatum des Autors:

Listing 5.11com/tutego/insel/date/CalendarDemo.java

package com.tutego.insel.date;

import java.util.Calendar;

public class CalendarDemo {

public static void main( String[] args ) {
Calendar cal = Calendar.getInstance();
printCalendar( cal );

cal.set( Calendar.DATE, 12 );
cal.set( Calendar.MONTH, Calendar.MARCH );
cal.set( Calendar.YEAR, 1973 );
printCalendar( cal );
}

private static final String[] DAYS = { "Sonntag", "Montag", "Dienstag", "Mittwoch",
"Donnerstag", "Freitag", "Samstag"};

public static void printCalendar( Calendar cal ) {
String dayOfWeek = DAYS[ cal.get(Calendar.DAY_OF_WEEK) – 1 ]; // Sonntag = 1

System.out.printf( "%s, %s.%s.%s, %02d:%02d:%02d und %d ms%n",
dayOfWeek,
cal.get(Calendar.DATE),
cal.get(Calendar.MONTH) + 1,
cal.get(Calendar.YEAR),
cal.get(Calendar.HOUR_OF_DAY),
cal.get(Calendar.MINUTE),
cal.get(Calendar.SECOND),
cal.get(Calendar.MILLISECOND));

System.out.printf( "Es ist die %d. Woche im Jahr und %d. Woche im Monat%n",
cal.get(Calendar.WEEK_OF_YEAR),
cal.get(Calendar.WEEK_OF_MONTH) );
}
}

Die Ausgabe des Programms lautet in etwa so:

Samstag, 5.5.2007, 10:57:54 und 609 ms
Es ist die 18. Woche im Jahr und 1. Woche im Monat
Montag, 12.3.1973, 10:57:54 und 609 ms
Es ist die 11. Woche im Jahr und 3. Woche im Monat

Da die Ausgabe auf diese Art und Weise nicht besonders komfortabel ist, werden wir mit DateFormat eine Klasse kennenlernen, die die Formatierung der Ausgabe vereinfacht (wir hätten im Programm schon ein Problem, wenn die Woche mehr als 7 Tage hätte). Das Beispiel soll ausschließlich die Nutzung der Feldbezeichner zeigen. Und da wir schon beim Thema »Formatieren« sind: Auch mit Format-Strings aus Formatter, die wir mit printf(…) oder String.format(…) nutzen, sind Datumsausgaben möglich.

 


Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

<< zurück
 Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Java SE 8 Standard-Bibliothek Java SE 8 Standard-Bibliothek
Jetzt Buch bestellen

 Buchempfehlungen
Zum Rheinwerk-Shop: Java ist auch eine Insel
Java ist auch eine Insel


Zum Rheinwerk-Shop: Professionell entwickeln mit Java EE 8
Professionell entwickeln mit Java EE 8


Zum Rheinwerk-Shop: Besser coden
Besser coden


Zum Rheinwerk-Shop: Entwurfsmuster
Entwurfsmuster


Zum Rheinwerk-Shop: IT-Projektmanagement
IT-Projektmanagement


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo

 
 


Copyright © Rheinwerk Verlag GmbH 2018
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

 
Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern