Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Sprachbeschreibung
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Mathematisches
6 Eigene Klassen schreiben
7 Angewandte Objektorientierung
8 Exceptions
9 Generics, innere Klassen
10 Die Klassenbibliothek
11 Threads und nebenläufige Programmierung
12 Datenstrukturen und Algorithmen
13 Raum und Zeit
14 Dateien und Datenströme
15 Die eXtensible Markup Language (XML)
16 Grafische Oberflächen mit Swing
17 Grafikprogrammierung
18 Netzwerkprogrammierung
19 Verteilte Programmierung mit RMI und Web–Services
20 JavaServer Pages und Servlets
21 Applets
22 Midlets und die Java ME
23 Datenbankmanagement mit JDBC
24 Reflection und Annotationen
25 Logging und Monitoring
26 Sicherheitskonzepte
27 Java Native Interface (JNI)
28 Dienstprogramme für die Java-Umgebung
Stichwort

Download:
- ZIP, ca. 14,1 MB
Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Java ist auch eine Insel (8. Auflage) von Christian Ullenboom
Programmieren mit der Java Standard Edition Version 6
Buch: Java ist auch eine Insel (8. Auflage)

Java ist auch eine Insel (8. Aufl.)
8., aktual. Auflage, geb., mit DVD
1.475 S., 49,90 Euro
Galileo Computing
ISBN 978-3-8362-1371-4
Pfeil 13 Raum und Zeit
Pfeil 13.1 Weltzeit
Pfeil 13.2 Wichtige Datum-Klassen im Überblick
Pfeil 13.3 Sprachen der Länder
Pfeil 13.3.1 Sprachen und Regionen über Locale-Objekte
Pfeil 13.4 Internationalisierung und Lokalisierung
Pfeil 13.4.1 ResourceBundle-Objekte und Ressource-Dateien
Pfeil 13.4.2 Ressource-Dateien zur Lokalisierung
Pfeil 13.4.3 Die Klasse ResourceBundle
Pfeil 13.4.4 Ladestrategie für ResourceBundle-Objekte
Pfeil 13.5 Die Klasse Date
Pfeil 13.5.1 Objekte erzeugen und Methoden nutzen
Pfeil 13.5.2 Date-Objekte nicht immutable
Pfeil 13.6 Calendar und GregorianCalendar
Pfeil 13.6.1 Die abstrakte Klasse Calendar
Pfeil 13.6.2 Der gregorianische Kalender
Pfeil 13.6.3 Ostertage
Pfeil 13.6.4 Abfragen und Setzen von Datumselementen
Pfeil 13.7 Formatieren und Parsen von Datumsangaben
Pfeil 13.7.1 Ausgaben mit printf()
Pfeil 13.7.2 Mit DateFormat und SimpleDateFormat formatieren
Pfeil 13.7.3 Parsen von Datumswerten
Pfeil 13.8 Zum Weiterlesen


Galileo Computing - Zum Seitenanfang

13.6 Calendar und GregorianCalendar Zur nächsten ÜberschriftZur vorigen Ü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. In Java 6 ist eine weitere interne Klasse für einen japanischen Kalender hinzugekommen. 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.


Galileo Computing - Zum Seitenanfang

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

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


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

  • static Calendar getInstance()
    Liefert einen Standard-Calendar mit der Standard-Zeitzone und Standard-Lokalisierung 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 Calendar (bzw. GregorianCalendar) hat keine menschenfreundliche toString()-Methode. Der String enthält alle Zustände des Objekts:

java.util.GregorianCalendar[time=1187732409256,areFieldsSet=true,Zeilen-Umbruch 
areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Berlin",Zeilen-Umbruch 
offset=3600000,dstSavings=3600000,useDaylight=true,transitions=143,Zeilen-Umbruch 
lastRule=java.util.SimpleTimeZone[id=Europe/Berlin,offset=3600000,dstSavings=3600000,Zeilen-Umbruch 
useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,Zeilen-Umbruch 
startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,Zeilen-Umbruch 
endTime=3600000,endTimeMode=2]],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,Zeilen-Umbruch 
YEAR=2007,MONTH=7,WEEK_OF_YEAR=34,WEEK_OF_MONTH=4,DAY_OF_MONTH=21,DAY_OF_YEAR=233,Zeilen-Umbruch 
DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=11,HOUR_OF_DAY=23,MINUTE=40,Zeilen-Umbruch 
SECOND=9,MILLISECOND=256,ZONE_OFFSET=3600000,DST_OFFSET=3600000]


Galileo Computing - Zum Seitenanfang

13.6.2 Der gregorianische Kalender Zur nächsten ÜberschriftZur vorigen Ü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.

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 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 dreizehnten Monat, der etwa bei einem Mondkalender anzutreffen ist. Die Konstanten sind keine typsicheren Enums, bieten aber den Vorteil, als int einfach mit ihnen zählen zu können.



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") );


Früher Fehler: 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 von Hand mit System.setProperty("user.timezone","Zeitzone"); oder über die Kommandozeile setzen.

$ java -Duser.timezone=Zeitzone Programm

Existiert die Variable nicht, nimmt der Kalender die Zeitzone 0 an. In Deutschland haben wir jedoch Central European Time. 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() 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.



Galileo Computing - Zum Seitenanfang

13.6.3 Ostertage Zur nächsten ÜberschriftZur vorigen Überschrift

In vielen Geschäftsprogrammen gibt es Fragen nach dem Ostersonntag [Viele wissen es nicht mehr: Da ist Jesus auferstanden.] , da er Bezugspunkt für viele Feiertage ist.

  • Aschermittwoch (Beginn des 40-tägigen Fastens) ist 46 Tage vor Ostersonntag und Rosenmontag mit Helau! und Alaaf! 48 Tage vor Ostersonntag.
  • Christi Himmelfahrt: (Auffahrt) 39 Tage nach Ostersonntag und immer an einem Donnerstag.
  • Pfingstsonntag: 49 Tage nach Ostersonntag.
  • Fronleichnam: (Fronleichnamsfest) 60 Tage nach Ostersonntag.
  • In manchen Gegenden werden drei Tage vor Christi Himmelfahrt Bitttage gefeiert.
  • Der vorletzte Sonntag vor Ostern heißt Passionssonntag.
  • Der Sonntag vor Ostern ist der Palmsonntag.

Zur Berechnung des beweglichen Ostersonntags gibt es unzählige Algorithmen. Eine Formel wurde 1876 in Butchers »Ecclesiastical Calendar« veröffentlicht. Er arbeitet für Jahre ab 1582 im gregorianischen Kalender korrekt, berücksichtigt aber keine julianischen Zeiten und liefert den Ostersonntag zwischen dem 22. März und 25. April.

Listing 13.8 com/tutego/insel/easter/Easter.java

package com.tutego.insel.easter; 
 
import java.util.*; 
 
public class Easter 
{ 
  /** 
   * Returns the date of Easter Sunday for a given year. 
   * 
   * @param year > 1583 
   * @return The date of Easter Sunday for a given year. 
   */ 
   public static Calendar easterSunday( int year ) 
   { 
    int i = year % 19; 
    int j = year / 100; 
    int k = year % 100; 
 
    int l = (19 * i + j – (j / 4) – ((j – ((j + 8) / 25) + 1) / 3) + 15) % 30; 
    int m = (32 + 2 * (j % 4) + 2 * (k / 4) – l – (k % 4)) % 7; 
    int n = l + m – 7 * ((i + 11 * l + 22 * m) / 451) + 114; 
 
    int month = n / 31; 
    int day   = (n % 31) + 1; 
 
    return  new GregorianCalendar( year, month – 1, day ); 
  } 
}

Ein Test soll für das aktuelle Jahr und die folgenden Jahre den Ostersonntag ausgeben.

Listing 13.9 com/tutego/insel/easter/EasterDemo.java. main()

Calendar cal = easterSunday( Calendar.getInstance().get(Calendar.YEAR) ); 
DateFormat df = DateFormat.getDateInstance( DateFormat.FULL ); 
 
String s = df.format( cal.getTime() ); 
out.println( s );                                       // Sonntag, 16. April 2006 
 
out.println( df.format(easterSunday(2007).getTime()));  // Sonntag, 8. April 2007 
out.println( df.format(easterSunday(2008).getTime()));  // Sonntag, 23. März 2008 
out.println( df.format(easterSunday(2009).getTime()));  // Sonntag, 12. April 2009 
out.println( df.format(easterSunday(2010).getTime()));  // Sonntag, 4. April 2010 
out.println( df.format(easterSunday(2011).getTime()));  // Sonntag, 24. April 2011 
out.println( df.format(easterSunday(2012).getTime()));  // Sonntag, 8. April 2012 
out.println( df.format(easterSunday(2013).getTime()));  // Sonntag, 31. März 2013

Beispiel Für Ostertage bietet GregorianCalendar zwar keine Methode, doch die Objektfunktion isLeapYear(int year) testet, ob year ein Schaltjahr repräsentiert. Auf den ersten Blick ist es schon seltsam, dass die Methode nicht statisch ist.



Galileo Computing - Zum Seitenanfang

13.6.4 Abfragen und Setzen von Datumselementen topZur vorigen Überschrift

Da java.util.Date-Objekte zwar auf den ersten Blick Konstruktoren anbieten, die Jahr, Monat, Tag entgegennehmen, diese Konstruktoren aber veraltet sind, sollten wir den Blick auf GregorianCalendar lenken. Um von diesem Calendar nun wieder 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().)


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

Listing 13.10 com/tutego/insel/date/ElapsedDays.java, main()

int date  = 1; 
int month = Calendar.JANUARY; 
int year  = 1900; 
long ms   = new GregorianCalendar( year, month, date ).getTimeInMillis(); 
long days = (System.currentTimeMillis() – ms) / (1000*60*60*24); 
System.out.println( days );                     // 38719

Eine Methode getTime() hat Calendar auch. Nur liefert die finale Methode uns ein java.util.Date-Objekt und kein long.


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.

Zugriff auf Felder über Feldbezeichner

Das Abfragen und Setzen von Datumselementen des gregorianischen 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/Zeit-Feld zugegriffen werden soll. Die get()-Methode liefert den Inhalt des angegebenen Felds, und set() schreibt den als zweites Argument übergebenen Wert in das Feld. Die folgende Tabelle gibt eine Übersicht der Feldbezeichner und ihrer Wertebereiche im Fall des konkreten GregorianCalendar.


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


Tabelle 13.1 Konstanten aus der Klasse 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


Nun können wir mit den Varianten von set() die Felder setzen und mit get() wieder hereinholen. 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. 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.


Beispiel Führe Anweisungen aus, wenn es 19 Uhr ist.

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


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.

Beispiel Was ist der erste und letzte Tag einer Kalenderwoche?

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

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


Ein gregorianischer Kalender mit eigenen Werten

Wir wollen im folgenden Beispiel ein Calendar-Objekt erzeugen und mit einer selbst geschriebenen Funktion printCalendar() 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 13.11 com/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 sieben Tage hätte.) Das Beispiel soll ausschließlich die Nutzung der Feldbezeichner zeigen. Und da wir schon beim Thema »Formatieren« sind: Auch mit Formatstrings aus Formatter, die wir mit printf() oder String.format() nutzen, sind Datumsausgaben möglich.

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. Da es keine sub()-Methoden gibt, können die Werte auch negativ sein.


Beispiel Wo waren wir heute vor einem Jahr?

Listing 13.12 com/tutego/insel/date/NowMinusOne.java, main()

Calendar cal = Calendar.getInstance(); 
System.out.printf( "%tF%n", cal );              // 2006-06-09 
cal.add( Calendar.YEAR, –1 ); 
System.out.printf( "%tF%n", cal );              // 2005-06-09

Eine weitere Methode roll() ändert keine folgenden Felder, was add() macht, wenn etwa zum Dreißigsten eines Monats zehn Tage addiert werden.

Wie viele Tage hat der Monat, wie viele Monate hat ein Jahr?

Diese Frage lässt sich einfach mit getActualMaximum() klären. Als Argument bekommt die 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 genau zwölf 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 Fingerknochen führen.

Listing 13.13 com/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) ); 
}


Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.






<< zurück
  Zum Katalog
Zum Katalog: Java ist auch eine Insel





Java ist auch eine Insel
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Tipp
Zum Katalog: Coding for Fun





 Coding for Fun


 Buchempfehlungen
Zum Katalog: Objektorientierte Programmierung





 Objektorientierte
 Programmierung


Zum Katalog: Einstieg in Eclipse 3.4






 Einstieg in
 Eclipse 3.4


Zum Katalog: Java 6 lernen mit Eclipse






 Java 6 lernen
 mit Eclipse


Zum Katalog: NetBeans Platform 6






 NetBeans
 Platform 6


Zum Katalog: Java und XML






 Java und XML


Zum Katalog: Visual C# 2008






 Visual C# 2008


Zum Katalog: IT-Handbuch für Fachinformatiker






 IT-Handbuch für
 Fachinformatiker


Zum Katalog: C++ von A bis Z






 C++ von A bis Z


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Galileo Press 2009
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.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de