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 7
2 Threads und nebenläufige Programmierung
3 Datenstrukturen und Algorithmen
4 Raum und Zeit
5 Dateien, Verzeichnisse und Dateizugriffe
6 Datenströme
7 Die eXtensible Markup Language (XML)
8 Dateiformate
9 Grafische Oberflächen mit Swing
10 Grafikprogrammierung
11 Netzwerkprogrammierung
12 Verteilte Programmierung mit RMI
13 RESTful und SOAP Web-Services
14 JavaServer Pages und Servlets
15 Applets
16 Datenbankmanagement mit JDBC
17 Technologien für die Infrastruktur
18 Reflection und Annotationen
19 Dynamische Übersetzung und Skriptsprachen
20 Logging und Monitoring
21 Java Native Interface (JNI)
22 Sicherheitskonzepte
23 Dienstprogramme für die Java-Umgebung
Stichwort

Buch bestellen
Ihre Meinung?

Spacer
Java 7 - Mehr als eine Insel von Christian Ullenboom
Das Handbuch zu den Java SE-Bibliotheken
Buch: Java 7 - Mehr als eine Insel

Java 7 - Mehr als eine Insel
Rheinwerk Computing
1433 S., 2012, geb.
49,90 Euro, ISBN 978-3-8362-1507-7
Pfeil 4 Raum und Zeit
Pfeil 4.1 Weltzeit *
Pfeil 4.2 Wichtige Datum-Klassen im Überblick
Pfeil 4.2.1 Der 1.1.1970
Pfeil 4.2.2 System.currentTimeMillis()
Pfeil 4.2.3 Einfache Zeitumrechnungen durch TimeUnit
Pfeil 4.3 Sprachen der Länder
Pfeil 4.3.1 Sprachen und Regionen über Locale-Objekte
Pfeil 4.4 Internationalisierung und Lokalisierung
Pfeil 4.4.1 ResourceBundle-Objekte und Ressource-Dateien
Pfeil 4.4.2 Ressource-Dateien zur Lokalisierung
Pfeil 4.4.3 Die Klasse ResourceBundle
Pfeil 4.4.4 Ladestrategie für ResourceBundle-Objekte
Pfeil 4.5 Die Klasse Date
Pfeil 4.5.1 Objekte erzeugen und Methoden nutzen
Pfeil 4.5.2 Date-Objekte sind nicht immutable
Pfeil 4.6 Calendar und GregorianCalendar
Pfeil 4.6.1 Die abstrakte Klasse Calendar
Pfeil 4.6.2 Der gregorianische Kalender
Pfeil 4.6.3 Calendar nach Date und Millisekunden fragen
Pfeil 4.6.4 Ostertage *
Pfeil 4.6.5 Abfragen und Setzen von Datumselementen über Feldbezeichner
Pfeil 4.6.6 Wie viele Tage hat der Monat, oder wie viele Monate hat ein Jahr? *
Pfeil 4.6.7 Wann beginnt die Woche und wann die erste Woche im Jahr? *
Pfeil 4.7 Zeitzonen in Java *
Pfeil 4.7.1 Zeitzonen durch die Klasse TimeZone repräsentieren
Pfeil 4.7.2 SimpleTimeZone
Pfeil 4.7.3 Methoden von TimeZone
Pfeil 4.8 Zeitdauern und der XML-Datentyp Duration *
Pfeil 4.8.1 DatatypeFactory als Fabrik
Pfeil 4.8.2 Die Duration-Klasse und ihre Methoden
Pfeil 4.9 Formatieren und Parsen von Datumsangaben
Pfeil 4.9.1 Ausgaben mit printf()
Pfeil 4.9.2 Mit DateFormat und SimpleDateFormat formatieren
Pfeil 4.9.3 Parsen von Datumswerten
Pfeil 4.10 Zum Weiterlesen

Rheinwerk Computing - Zum Seitenanfang

4.8 Zeitdauern und der XML-Datentyp Duration *Zur nächsten Überschrift

Eine der Schwachstellen in der Datumsverarbeitung ist das Fehlen eines Typs für Dauern (wenn wir von TimeUnit einmal absehen). Ein eigenständiger Typ bringt Vorteile, wenn es zum Beispiel darum geht, Dauern zu addieren (»Was ergibt eine Woche plus 2 Monate?«) oder zu vergleichen (»Ist 1 Stunde mehr als 123456789 Millisekunden?«). Zwar lassen sich mit der add()-Methode von Calendar einzelne Segmente ändern, und dadurch lässt sich ein früherer oder späterer Zeitpunkt ansteuern, aber das ist wenig objektorientiert. Besser ist ein eigener Datentyp, der auch Operationen anbietet, um die Dauer auf ein Calendar- oder Date-Objekt zu setzen.


Rheinwerk Computing - Zum Seitenanfang

4.8.1 DatatypeFactory als FabrikZur nächsten ÜberschriftZur vorigen Überschrift

Java 5 führte im Rahmen der W3C-XML-Schema-Unterstützung diverse neue Klassen ein, unter anderem den Typ Duration für Dauern nach der gregorianischen Zeit. Die Klasse liegt jedoch nicht im java.util-Paket, sondern wegen ihres XML-Bezugs im Paket javax.xml.datatype (wo es neben XMLGregorianCalendar nahezu alleine liegt). Exemplare von Duration werden auch von keinem Konstruktor angelegt, sondern von einer Fabrikklasse DatatypeFactory.

Beispiel

Lege ein Duration-Objekt mit der Dauer von einem Tag und zwei Stunden an:

Duration d = DatatypeFactory.newInstance().newDuration(true, 0, 0, 1, 2, 0, 0 );
System.out.println( d ); // P0Y0M1DT1H0M0S

Die DatatypeFactory bietet diverse Fabrikmethoden zum Anlegen der Duration-Objekte. Die Parameterlisten sind wie im Beispiel mitunter recht lang – in der längsten Variante gibt es einen Indikator für ein Vorzeichen, Jahr, Monat, Tag, Stunden, Minuten, Sekunden (keine Millisekunden oder genauer), also mit 7 Parametern. Ein Builder-Pattern zum Aufbau der Objekte wäre nett gewesen ...

abstract class javax.xml.datatype.DatatypeFactory
  • static DatatypeFactory newInstance() throws DatatypeConfigurationException
  • Duration newDuration(boolean isPositive, int years, int months, int days, int hours,
    int minutes, int seconds)
  • abstract Duration newDuration(boolean isPositive, BigInteger years, BigInteger months,
    BigInteger days, BigInteger hours, BigInteger minutes, BigDecimal seconds)
  • abstract Duration newDuration(long durationInMilliSeconds)
  • abstract Duration newDuration(String lexicalRepresentation)
  • Duration newDurationDayTime(boolean isPositive, BigInteger day, BigInteger hour, BigInteger minute, BigInteger second)
  • Duration newDurationDayTime(boolean isPositive, int day, int hour, int minute, int second)
  • Duration newDurationDayTime(long durationInMilliseconds)
  • Duration newDurationDayTime(String lexicalRepresentation)
  • Duration newDurationYearMonth(boolean isPositive, BigInteger year, BigInteger month)
  • Duration newDurationYearMonth(boolean isPositive, int year, int month)
  • Duration newDurationYearMonth(long durationInMilliseconds)
  • Duration newDurationYearMonth(String lexicalRepresentation)

Rheinwerk Computing - Zum Seitenanfang

4.8.2 Die Duration-Klasse und ihre MethodenZur nächsten ÜberschriftZur vorigen Überschrift

Die Duration-Ausgabe im Beispiel über toString() liefert eine besondere String-Repräsentation, die für XML-Dokumente interessant ist, aber andere Methoden sind interessanter. Eine grobe Einteilung ergibt:

  • Anfragemethoden für die Segmente wie getYear(), getDay(), ...
  • Vergleichsmethoden wie compare() oder isLongerThan()
  • Duration-Objekte sind immutable, doch gibt es Methoden wie add() oder multiply(), die neue Duration-Objekte mit veränderten Segmenten zurückgeben, oder normalizeWith(), die Calendar-Felder zur Initialisierung nutzt.
  • Anwenden der Duration-Objekte auf Calendar oder Date mit addTo()
Beispiel

Addiere die Dauer von 2 Monaten und 3 Tagen, und berechne, wo wir dann relativ zu heute stehen.

DatatypeFactory datatypeFactory = DatatypeFactory.newInstance();
Duration d1 = datatypeFactory.newDurationYearMonth( true, 0, 2 );
Duration d2 = datatypeFactory.newDuration( true, 0, 0, 3, 0, 0, 0 );
Duration sum = d1.add( d2 )
;
Date date = new Date();
System.out.printf( "%tF%n", date ); // 2011-06-21
sum.addTo( date )
;
System.out.printf( "%tF%n", date ); // 2011-08-24

Mögliche und unmögliche Operationen

Intern speichert die Duration-Implementierung jedes einzelne Segment und legt es nicht zu einer Zahl, etwa Sekunden zusammen. Das wäre auch nicht möglich, da die Anzahl Tage im Monat und im Jahr nicht immer gleich sind (dass zeigen uns der Februar und Schaltjahre). Wenn wir auf dem 1.1. einen Monat addieren, wollen wir beim 1.2. auskommen, und wenn wir bei 1.2. beginnen und einen Monat addieren, soll der 1.3. das Ergebnis sein.

Beispiel

Additionen eines Monats auf einen Kalender:

DatatypeFactory datatypeFactory = DatatypeFactory.newInstance();
Duration month = datatypeFactory.newDurationYearMonth( true, 0, 1 );
Calendar cal = new GregorianCalendar( 2012, Calendar.JANUARY, 1 );
month.addTo( cal );
System.out.printf( "%tF%n", cal); // 2012-02-01
month.addTo( cal );
System.out.printf( "%tF%n", cal); // 2012-03-01

Da die Anzahl der Tage im Monat und im Jahr beweglich ist, sind bei add() und substract() nur gewisse Kombinationen möglich. Es gibt Operationen, die Duration nicht ausführen kann und mit einer IllegalStateException bestraft. Während innerhalb der Gruppe Sekunden, Minuten, Stunden und Tage beliebig addiert und subtrahiert werden kann, ist der Übergang nach Monat und Jahr problematisch, insbesondere bei Subtraktionen.

Beispiel

Ein Monat minus ein Tag ist genauso wenig möglich wie ein Jahr minus ein Tag.

DatatypeFactory factory = DatatypeFactory.newInstance();
Duration year = factory.newDuration( true, 1, 0, 0, 0, 0, 0 );
Duration month = factory.newDuration( true, 0, 1, 0, 0, 0, 0 );
Duration day = factory.newDuration( true, 0, 0, 1, 0, 0, 0 );
year.subtract( day ); // Fehler IllegalStateException
month.subtract( day ); // Fehler IllegalStateException

Duration-Vergleiche

Beim Vergleichen zweier Dauern gibt es vier unterschiedliche Ergebnisse, und daher implementiert Duration auch nicht die bekannte Comparable-Schnittstelle. Der Grund ist, dass einige Vergleiche nicht endscheidbar sind. So sind 30 Tage sind nicht automatisch 1 Monat, 365 Tage nicht automatisch 1 Jahr. Die compare()-Methode liefert Ganzahlen, die den jeweiligen Ausgang dokumentieren:

Tabelle 4.2: Ausgang von Vergleichen zwischen Duration-Objekten

Vergleichsergebnis Beispiel Konstante

Dauer1 ist kürzer als Dauer2

1 Minute ist kürzer als 100 Sekunden

DatatypeConstants.LESSER

Dauer1 ist länger als Dauer2

1 Tag ist länger als 1 Minute

DatatypeConstants.GREATER

Dauer1 ist gleichlang Dauer2

1 Minute ist gleich 60 Sekunden

DatatypeConstants.EQUAL

Dauer1 ist unvergleichbar mit Dauer2

30 Tage sind nicht automatisch 1 Monat

DatatypeConstants.INDETERMINATE

Beispiel

Vergleiche 30 Tage mit einem Monat:

DatatypeFactory factory = DatatypeFactory.newInstance();
Duration month = factory.newDurationYearMonth( true, 0, 1 );
Duration thirtyDays = factory.newDuration( true, 0, 0, 30, 0, 0, 0 );
System.out.println( month.compare( thirtyDays ) ==
DatatypeConstants.INDETERMINATE ); // true
System.out.println( month.isLongerThan( thirtyDays ) ); // false
System.out.println( thirtyDays.isLongerThan( month ) ); // false

Wir sprechen bei Duration daher auch nur von einer partiellen Ordnung statt von einer vollständigen Ordnung.

Zusammenfassung der Duration-Methoden

abstract class javax.xml.datatype.DatatypeFactory
  • abstract int getSign()
  • int getYears()
  • int getMonths()
  • int getDays()
  • int getHours()
  • int getMinutes()
  • int getSeconds()
  • abstract Duration add(Duration rhs)
  • Duration subtract(Duration rhs)
  • Duration multiply(int factor)
  • abstract Duration multiply(BigDecimal factor)
  • abstract Duration negate()
  • abstract int compare(Duration duration)
  • boolean isLongerThan(Duration duration)
  • boolean isShorterThan(Duration duration)
  • abstract void addTo(Calendar calendar)
  • void addTo(Date date)
  • abstract Duration normalizeWith(Calendar startTimeInstant)
  • long getTimeInMillis(Calendar startInstant)
  • long getTimeInMillis(Date startInstant)
  • abstract boolean isSet(DatatypeConstants.Field field)
  • abstract Number getField(DatatypeConstants.Field field)
  • QName getXMLSchemaType()
  • abstract int hashCode()
  • boolean equals(Object duration)
  • String toString()


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 7 – Mehr als eine Insel
Java 7 – Mehr als eine Insel
Jetzt bestellen


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

 Buchempfehlungen
Zum Katalog: Java SE Bibliotheken






 Java SE Bibliotheken


Zum Katalog: Professionell entwickeln mit Java EE 7






 Professionell
 entwickeln mit
 Java EE 7


Zum Katalog: Java ist auch eine Insel






 Java ist auch
 eine Insel


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 2012
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das 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