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

Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Imperative Sprachkonzepte
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Eigene Klassen schreiben
6 Exceptions
7 Äußere.innere Klassen
8 Besondere Klassen der Java SE
9 Generics<T>
10 Architektur, Design und angewandte Objektorientierung
11 Die Klassenbibliothek
12 Einführung in die nebenläufige Programmierung
13 Einführung in Datenstrukturen und Algorithmen
14 Einführung in grafische Oberflächen
15 Einführung in Dateien und Datenströme
16 Einführung in die <XML>-Verarbeitung mit Java
17 Einführung ins Datenbankmanagement mit JDBC
18 Bits und Bytes und Mathematisches
19 Die Werkzeuge des JDK
A Die Klassenbibliothek
Stichwort

Download:
- Aufgaben, ca. 1,1 MB
- Programme, ca. 12,8 MB

Buch bestellen
Ihre Meinung?

Spacer
Java ist auch eine Insel von Christian Ullenboom
Das umfassende Handbuch
Buch: Java ist auch eine Insel

Java ist auch eine Insel
Galileo Computing
1308 S., 10., aktualisierte Auflage, geb., mit DVD
ca. 49,90 Euro, ISBN 978-3-8362-1802-3
Pfeil 11 Die Klassenbibliothek
Pfeil 11.1 Die Java-Klassenphilosophie
Pfeil 11.1.1 Übersicht über die Pakete der Standardbibliothek
Pfeil 11.2 Sprachen der Länder
Pfeil 11.2.1 Sprachen und Regionen über Locale-Objekte
Pfeil 11.3 Die Klasse Date
Pfeil 11.3.1 Objekte erzeugen und Methoden nutzen
Pfeil 11.3.2 Date-Objekte sind nicht immutable
Pfeil 11.4 Calendar und GregorianCalendar
Pfeil 11.4.1 Die abstrakte Klasse Calendar
Pfeil 11.4.2 Der gregorianische Kalender
Pfeil 11.4.3 Calendar nach Date und Millisekunden fragen
Pfeil 11.4.4 Abfragen und Setzen von Datumselementen über Feldbezeichner
Pfeil 11.5 Klassenlader (Class Loader)
Pfeil 11.5.1 Woher die kleinen Klassen kommen
Pfeil 11.5.2 Setzen des Klassenpfades
Pfeil 11.5.3 Die wichtigsten drei Typen von Klassenladern
Pfeil 11.5.4 Die Klasse java.lang.ClassLoader *
Pfeil 11.5.5 Hot Deployment mit dem URL-Classloader *
Pfeil 11.5.6 Das Verzeichnis jre/lib/endorsed *
Pfeil 11.6 Die Utility-Klasse System und Properties
Pfeil 11.6.1 Systemeigenschaften der Java-Umgebung
Pfeil 11.6.2 line.separator
Pfeil 11.6.3 Eigene Properties von der Konsole aus setzen *
Pfeil 11.6.4 Umgebungsvariablen des Betriebssystems *
Pfeil 11.6.5 Einfache Zeitmessung und Profiling *
Pfeil 11.7 Einfache Benutzereingaben
Pfeil 11.7.1 Grafischer Eingabedialog über JOptionPane
Pfeil 11.7.2 Geschützte Passwort-Eingaben mit der Klasse Console *
Pfeil 11.8 Ausführen externer Programme *
Pfeil 11.8.1 ProcessBuilder und Prozesskontrolle mit Process
Pfeil 11.8.2 Einen Browser, E-Mail-Client oder Editor aufrufen
Pfeil 11.9 Benutzereinstellungen *
Pfeil 11.9.1 Benutzereinstellungen mit der Preferences-API
Pfeil 11.9.2 Einträge einfügen, auslesen und löschen
Pfeil 11.9.3 Auslesen der Daten und Schreiben in einem anderen Format
Pfeil 11.9.4 Auf Ereignisse horchen
Pfeil 11.9.5 Zugriff auf die gesamte Windows-Registry
Pfeil 11.10 Zum Weiterlesen

Rheinwerk Computing - Zum Seitenanfang

11.4 Calendar und GregorianCalendarZur 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. 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.


Rheinwerk Computing - Zum Seitenanfang

11.4.1 Die abstrakte Klasse CalendarZur nächsten ÜberschriftZur vorigen Ü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 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.

Abbildung

Abbildung 11.2: UML-Diagramm der Klasse Calendar

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


Rheinwerk Computing - Zum Seitenanfang

11.4.2 Der gregorianische KalenderZur 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.
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.

Abbildung

Abbildung 11.3: UML-Diagramm für GregorianCalendar

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


Rheinwerk Computing - Zum Seitenanfang

11.4.3 Calendar nach Date und Millisekunden fragenZur nächsten ÜberschriftZur 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, wie wir das im vorangehenden Abschnitt gemacht haben.

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()).

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

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.

Rheinwerk Computing - Zum Seitenanfang

11.4.4 Abfragen und Setzen von Datumselementen über FeldbezeichnerZur nächsten ÜberschriftZur vorigen Überschrift

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-/Zeitfeld zugegriffen werden soll. Die get()-Methode liefert den Inhalt des angegebenen Felds, und set() schreibt den als zweites Argument übergebenen Wert in das Feld.

Beispiel

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

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

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 11.2: 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. Die Woche beginnt in der Java-Welt also bei 1 und Sonntag, statt – wie vielleicht anzunehmen – bei 0 und Montag.

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, so müssen Nutzer der Calendar-Klasse immer die get(field)-Methode nutzen. Es gibt keinen 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.

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.

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

Beispiel

Wo waren wir heute vor einem Jahr?

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.

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 angegeben 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.

In GregorianCalendar ist die Implementierung in Wirklichkeit etwas anders. Da ist roll(int, int) implementiert, und roll(int, boolean) ist ein Aufruf von roll(field, up ? +1 : –1).



Ihr Kommentar

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

>> Zum Feedback-Formular
<< 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

 Buchempfehlungen
Zum Katalog: Java ist auch eine Insel






 Java ist auch
 eine Insel


Zum Katalog: Java SE Bibliotheken






 Java SE Bibliotheken


Zum Katalog: Professionell entwickeln mit Java EE 7






 Professionell
 entwickeln mit
 Java EE 7


Zum Katalog: Einstieg in Eclipse






 Einstieg in
 Eclipse


Zum Katalog: Einstieg in Java






 Einstieg in
 Java


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2011
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.


[Rheinwerk Computing]

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