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
Download: - openbook, ca. 21,3 MB
Buch bestellen
Ihre Meinung?
<< zurück | Galileo Computing / <openbook> / Java 7 - Mehr als eine Insel | vor >>
Java 7 - Mehr als eine Insel von Christian Ullenboom Das Handbuch zu den Java SE-Bibliotheken
Java 7 - Mehr als eine Insel Galileo Computing 1433 S., 2012, geb. 49,90 Euro, ISBN 978-3-8362-1507-7 |
| 4 Raum und Zeit
|  | 4.1 Weltzeit *
|  | 4.2 Wichtige Datum-Klassen im Überblick
|  |  | 4.2.1 Der 1.1.1970
|  |  | 4.2.2 System.currentTimeMillis()
|  |  | 4.2.3 Einfache Zeitumrechnungen durch TimeUnit
|  | 4.3 Sprachen der Länder
|  |  | 4.3.1 Sprachen und Regionen über Locale-Objekte
|  | 4.4 Internationalisierung und Lokalisierung
|  |  | 4.4.1 ResourceBundle-Objekte und Ressource-Dateien
|  |  | 4.4.2 Ressource-Dateien zur Lokalisierung
|  |  | 4.4.3 Die Klasse ResourceBundle
|  |  | 4.4.4 Ladestrategie für ResourceBundle-Objekte
|  | 4.5 Die Klasse Date
|  |  | 4.5.1 Objekte erzeugen und Methoden nutzen
|  |  | 4.5.2 Date-Objekte sind nicht immutable
|  | 4.6 Calendar und GregorianCalendar
|  |  | 4.6.1 Die abstrakte Klasse Calendar
|  |  | 4.6.2 Der gregorianische Kalender
|  |  | 4.6.3 Calendar nach Date und Millisekunden fragen
|  |  | 4.6.4 Ostertage *
|  |  | 4.6.5 Abfragen und Setzen von Datumselementen über Feldbezeichner
|  |  | 4.6.6 Wie viele Tage hat der Monat, oder wie viele Monate hat ein Jahr? *
|  |  | 4.6.7 Wann beginnt die Woche und wann die erste Woche im Jahr? *
|  | 4.7 Zeitzonen in Java *
|  |  | 4.7.1 Zeitzonen durch die Klasse TimeZone repräsentieren
|  |  | 4.7.2 SimpleTimeZone
|  |  | 4.7.3 Methoden von TimeZone
|  | 4.8 Zeitdauern und der XML-Datentyp Duration *
|  |  | 4.8.1 DatatypeFactory als Fabrik
|  |  | 4.8.2 Die Duration-Klasse und ihre Methoden
|  | 4.9 Formatieren und Parsen von Datumsangaben
|  |  | 4.9.1 Ausgaben mit printf()
|  |  | 4.9.2 Mit DateFormat und SimpleDateFormat formatieren
|  |  | 4.9.3 Parsen von Datumswerten
|  | 4.10 Zum Weiterlesen
## 4.9 Formatieren und Parsen von Datumsangaben Nachdem wir die Calendar-Exemplare dazu benutzt haben, Datumswerte zu verwalten, wollen wir nun untersuchen, wie Formatierungsklassen dazu landestypische Ausgaben erzeugen. Unsere eigenen Ausgaben haben wir ja schon gemacht, doch geht es noch besser, weil die Java-Bibliothek für viele Länder selbstständig die richtigen Ausgaben durchführt. ### 4.9.1 Ausgaben mit printf() Die format()- bzw. printf()-Methoden sind in Java sehr flexibel und können auch Datumswerte ausgeben. Das können sie allerdings nicht so gut wie Klassen rund um DateFormat, doch kann es ausreichen, wenn Datumswerte nicht lokalisiert behandelt werden müssen: Listing 4.12: com/tutego/insel/date/DateFormatWithPrintf.java, main()
    Calendar cal = Calendar.getInstance();
    System.out.printf( "%tR%n", cal );                 // 06:17
    System.out.printf( "%tT%n", cal );                 // 06:17:05
    System.out.printf( "%tD%n", cal );                 // 09/25/07
    System.out.printf( "%tF%n", cal );                 // 2007-09-25
    System.out.printf( Locale.CHINA, "%tD%n", cal );   // 09/25/07 (!)
    System.out.printf( Locale.GERMANY, "%tD%n", cal ); // 09/25/07 (!)
Das Ergebnis ist zweistellig, daher nicht ganz Jahr-2000-fest.[34](Im November 1999 wurde ein Algorithmus zur Lösung des Jahr-2000-Problems patentiert, der einfach aussagt, dass zweistellige Jahreszahlen unter 30 zu 20XX und alle Jahreszahlen >30 zu 19XX zu ergänzen sind. Das Patent konnte allerdings erfolgreich angefochten werden.) Besonders beim letzten Beispiel ist abzulesen, dass die Locale-Angabe für Datumswerte generell nicht funktioniert (chinesische Datumsangaben beginnen mit dem Jahr). Die Abkürzungen %tR, %tT, %tD und %tF sind mit festen Reihenfolgen definiert, die die API-Dokumentation zeigt. So ist %tD nichts anderes als eine Abkürzung für %tm/%td/%ty. ### 4.9.2 Mit DateFormat und SimpleDateFormat formatieren Eine Klasse, die die Ausgabe und das Einlesen der Datum-Felder übernimmt, ist DateFormat. Da DateFormat abstrakt ist, ist erst eine implementierende Unterklasse einsatzbereit. Natürlich liegt eine solche Klasse auch vor: SimpleDateFormat. Die Klasse bietet reichhaltige Methoden zur Zerlegung von Datum-Zeichenketten sowie Methoden zur Ausgabe unter verschiedenen Sprachen und Formatierungen an.
Beispiel
Ausgabe des Datums ohne zusätzliche Formatierungsanweisungen mit der Klasse SimpleDateFormat und einmal mit der printf()-Methode:
    Calendar cal  = Calendar.getInstance();
    Date     time = cal.getTime();
    DateFormat formatter = new SimpleDateFormat();
    System.out.println( formatter.format( time ) ); // 26.04.10 18:11
    System.out.printf( "%tT%n", cal );              // 18:11:11
    System.out.printf( "%tT%n", time );             // 18:11:11
    System.out.printf( "%tT%n", time.getTime() );   // 18:11:11
Formatiert printf() ein Datum, kann es als Calendar-, Date- oder Long-Objekt angegeben werden. Bei format() ist nur Date erlaubt; ist es ein Calendar, folgt eine »java.lang.IllegalArgumentException: Cannot format given Object as a Date«.
Abbildung 4.6: Vererbungsbeziehungen von DateFormat und SimpleDateFormat Um das Datum zu formatieren, müssen wir zunächst ein Exemplar von SimpleDateFormat erzeugen. Dieses bekommt dann eventuell Formatierungsanweisungen (über eine andere Methode oder über einen weiteren Konstruktor) und formatiert mit der format()-Methode das Datum.
    class java.text.SimpleDateFormat
    extends DateFormat
SimpleDateFormat() Erzeugt ein neues SimpleDateFormat-Objekt in der voreingestellten Sprache.
    abstract class java.text.DateFormat
    extends Format
    implements Cloneable
final String format(Date date) Formatiert das Datum date in einen Datum/Zeit-String. Ein Calendar-Objekt ist bisher nicht erlaubt. Wer es dennoch versucht, wird eine »java.lang.IllegalArgumentException: Cannot format given Object as a Date« ernten. Zur Erinnerung: cal.getTime() liefert vom Calendar-Objekt cal ein passendes Date-Objekt. #### Vorgefertigte Formatierungen Wir haben im vorigen Beispiel gesehen, dass das Ausgabeformat auf Monat, Tag, Jahr, Leerzeichen, Stunde, Minute festgelegt ist. Nun bietet die DateFormat-Klasse drei statische Fabrikmethoden für vorgefertigte Formatierungen: DateFormat getDateInstance(): Formatierung nur für Datum DateFormat getTimeInstance(): Formatierung nur für Zeit DateFormat getDateTimeInstance(): Formatierung für Datum und Zeit Optional lassen sich den Methoden Argumente für Präzisionen mitgeben, und zwar DateFormat.SHORT, DateFormat.MEDIUM, DateFormat.LONG oder DateFormat.FULL. Diese ermöglichen es, dass sich die Zeit beziehungsweise das Datum auf vier Arten formatieren lässt:

Tabelle 4.3: Konstanten aus DateFormat und ihre Wirkung

Konstante | Beispiel für Datum | Beispiel für Zeit
DateFormat.SHORT | 24.12.06 | 21:54
DateFormat.MEDIUM | 24.12.2006 | 21:54:46
DateFormat.LONG | 24. Dezember 2006 | 21:54:20 GMT+02:00
DateFormat.FULL | Sonntag, 24. Dezember 2006 | 21.54 Uhr GMT+02:00
Den statischen Methoden lässt sich weiterhin ein Locale-Objekt übergeben, sodass sie für eine bestimmte Landessprache formatieren: Listing 4.13: com/tutego/insel/date/DateTimeInstance.java, main()
    Date d = new Date();

    DateFormat df = DateFormat.getDateTimeInstance(
                      /* dateStyle = */ DateFormat.FULL,
                      /* timeStyle = */ DateFormat.MEDIUM );
    out.println( df.format(d) ); // Dienstag, 25. September 2007 17:28:03

    df = DateFormat.getDateTimeInstance( DateFormat.FULL, DateFormat.MEDIUM,
                                         Locale.ITALY );
    out.println( df.format(d) ); // martedì 25 settembre 2007 17.28.03

    df = DateFormat.getDateTimeInstance( DateFormat.SHORT, DateFormat.FULL,
                                         Locale.CANADA_FRENCH );
    out.println( df.format(d) ); // 07-09-25 17 h 28 CEST
Die statischen Methoden, die das vordefinierte DateFormat erzeugen, sind:
    abstract class java.text.DateFormat
    extends Format
    implements Cloneable
static final DateFormat getDateInstance() static final DateFormat getTimeInstance() static final DateFormat getDateTimeInstance() Liefert einen Datum/Zeit-Formatierer mit dem vorgegebenen Stil aus der Standardumgebung. static final DateFormat getDateInstance(int dateStyle) static final DateFormat getTimeInstance(int style) Liefert einen Datum/Zeit-Formatierer mit dem Stil style und der Standardsprache. static final DateFormat getDateInstance(int style, Locale aLocale) static final DateFormat getTimeInstance(int style, Locale aLocale) Liefert einen Datum/Zeit-Formatierer mit dem Stil style und der Sprache aLocale. static final DateFormat getDateTimeInstance(int dateStyle, int timeStyle) Gibt einen Datum/Zeit-Formatierer für die gesetzte Sprache im angegebenen Formatierungsstil zurück. static final DateFormat getDateTimeInstance(int dateStyle, int timeStyle, Locale aLocale) Gibt einen Datum/Zeit-Formatierer für die Sprache aLocale im angegebenen Formatierungsstil zurück. #### Eine noch individuellere Ausgabe * Um das Ausgabeformat zu individualisieren, kann ein Formatierungsstring die Ausgabe anpassen. Diese Formatierungsanweisung, in der alle ASCII-Zeichen eine bestimmte Bedeutung haben, wird entweder dem Konstruktor der Klasse SimpleDateFormat übergeben oder kann mit der applyPattern()-Methode geändert werden: Listing 4.14: com/tutego/insel/date/SimpleDateFormatPattern.java, main()
    DateFormat dfmt = new SimpleDateFormat( "E.', den' dd.MM.yy 'um' hh:mm:ss" );
    System.out.println( dfmt.format(new Date()) );   // Mi., den 21.03.07 um 09:14:20

    SimpleDateFormat sdfmt = new SimpleDateFormat();
    sdfmt.applyPattern( "EEEE', 'dd. MMMM yyyy hh:mm" );
    System.out.println( sdfmt.format(new Date()) ); // Mittwoch, 21. März 2007 09:14
Die folgende Tabelle zeigt die erlaubten Symbole mit ihren Sonderbedeutungen. Mehrfach wiederholte Zeichen werden, wenn möglich, durch die Langform der jeweiligen Angabe ersetzt. Diese Symbole sind sprachunabhängig.

Tabelle 4.4: Symbole im Formatierungsstring zur Steuerung der Ausgabe bei SimpleDateFormat

Symbol | Bedeutung | Präsentation | Beispiel
G | Ära | Text | AD
yy | Jahr zweistellig | Nummer | 07
yyyy | Jahr vierstellig | Nummer | 2007
M | Monat im Jahr | Nummer | 7
MM | Monat im Jahr mit 0 | Nummer | 07
MMM | Monat im Jahr, kurz | Text | Sep
MMMM | Monat im Jahr, lang | Text | September
d | Tag im Monat | Nummer | 26
h | Stunde (1–12) | Nummer | 9
H | Stunde am Tag (0–23) | Nummer | 0
m | Minute der Stunde | Nummer | 13
s | Sekunde der Minute | Nummer | 22
S | Millisekunde | Nummer | 257
E | Tag der Woche, kurz | Text | Mi
EEEE | Tag der Woche, lang | Text | Mittwoch
D | Tag im Jahr | Nummer | 304
F | Tag der Woche im Monat | Nummer | 3
w | Woche im Jahr | Nummer | 12
W | Woche im Monat | Nummer | 3
a | am- und pm-Text | Text | AM
k | Stunde am Tag (1–24) | Nummer | 24
K | Stunde (0–11) | Nummer | 0
z | Allgemeine Zeitzone | Text | GMT+02:00
Z | Zeitzone nach RFC 822 | Text | +0200
' | Zeichen für unbehandelten Text | Trennzeichen | Hallo Welt
'' | Einzelnes Hochkomma | Literal | '

Tabelle 4.5: Beispiele für Symbole bei SimpleDateFormat

Formatierungsstring | Ergebnis
yyyy.MM.dd G 'um' hh:mm:ss z | 2004.07.23 n. Chr. um 09:15:53 CEST
EEE, MMM d, ''yy | Fr, Jul 23, '04
H:mm a | 9:16 AM
hh 'o''clock' a, zzzz | 09 o'clock AM, Zentraleuropäische Sommerzeit
K:mm a, z | 9:17 AM, CEST
yyyy. MMMMM. dd GGG hh:mm aaa | 2004. Juli. 23 n. Chr. 09:18 AM
    class java.text.SimpleDateFormat
    extends DateFormat
SimpleDateFormat() Erzeugt ein neues SimpleDateFormat-Objekt in der eingestellten Sprache. SimpleDateFormat(String pattern) Erzeugt ein SimpleDateFormat-Objekt mit dem vorgegebenen Formatierungsstring in der voreingestellten Sprache. SimpleDateFormat(String pattern, Locale locale) Erzeugt ein SimpleDateFormat-Objekt mit dem vorgegebenen Formatierungsstring in der Sprache locale. SimpleDateFormat(String pattern, DateFormatSymbols formatSymbols) Erzeugt ein SimpleDateFormat-Objekt mit dem vorgegebenen Formatierungsstring und einem Objekt formatSymbols, das die formatierungstypischen Informationen sammelt. void applyPattern(String pattern) Setzt den Formatierungsstring. String toPattern() Liefert den aktuell eingestellten Formatierungsstring. String toLocalizedPattern() Liefert einen übersetzten Formatierungsstring. Substituiert einige Formatierungssymbole. ### 4.9.3 Parsen von Datumswerten Mit der Klasse DateFormat zerlegt parse() Strings, die ein Datum darstellen. Die Methode liefert ein Date-Objekt zurück und kann so zum Beispiel den Zeit-String »Mon Aug 08 15:02:00 CEST 2005« parsen und ein Datumsobjekt liefern, was new Date(1123506132484) gleichkommt. Da parse() allzu leicht schiefgehen kann, muss der Aufruf entweder in einen try-Block gesetzt werden, oder der Fehler muss anderweitig weitergeleitet werden.
Beispiel
Parse eine einfache Datumsrepräsentation. Erzeuge dann vom Datumsobjekt eine String-Repräsentation, und parse diese wieder: Listing 4.15: com/tutego/insel/date/FormatAndParseDate.java, main()
    try
    {
      DateFormat formatter = DateFormat.getDateTimeInstance();
      Date d  = formatter.parse( "24.12.2007 16:59:12" );
      System.out.println( d );                  // Mon Dec 24 16:59:12 CET 2007
      String s = formatter.format( new Date() );
      System.out.println( formatter.parse(s) ); // Wed Mar 21 21:29:02 CET 2007
    }
    catch ( ParseException e ) { e.printStackTrace(); }
Die Methode parse() ist sehr empfindlich, wenn einige Felder nicht angegeben werden. Nach der Dokumentation sollte zwar ein Fehlen der Stunden nichts ausmachen, aber leider ist uns dann doch immer eine ParseException sicher, auch wenn nur die Sekunden fehlen. Wegen dieser Unzulänglichkeiten ist die Klasse SimpleDateFormat sehr komplex und nicht leicht zu durchschauen.
Beispiel
Parse ein Datum, das das Format »Tag-Monat-Jahr« hat, wobei das Jahr vierstellig sein soll und der Monat zweistellig.
    DateFormat formatter = new SimpleDateFormat( "dd-MM-yyyy " );
    Date date = formatter.parse( "12-03-2008" );
Jetzt haben wir ein Datum in ein Date-Objekt umgewandelt. Es taucht aber wieder das Problem auf, dass Date an kein spezielles Land und an keine Zeitzone angepasst ist, sondern die GMT in Englisch repräsentiert.
    abstract class java.text.DateFormat
    extends Format
    implements Cloneable, Serializable
Date parse(String source) throws ParseException Zerlegt einen Datums- oder einen Zeit-String. #### parse() – die Nachsichtige Die Methode parse() beschwert sich standardmäßig nicht über unsinnige Werte. Um für eine Ausnahme zu sorgen, bietet DateFormat eine Methode setLenient(boolean), die den »Mildmodus« mit setLenient(false) ausschaltet. Das zeigen die folgenden Zeilen: Listing 4.16: com/tutego/insel/date/ParseLenient.java, main()
    try
    {
      DateFormat formatter1 = new SimpleDateFormat( "dd-MM-yyyy" );
      System.out.printf( "%tF%n", formatter1.parse( "29-02-2008" ) ); // 2008-02-29
      System.out.printf( "%tF%n", formatter1.parse( "29-02-2007" ) ); // 2007-03-01
      System.out.printf( "%tF%n", formatter1.parse( "33-02-2008" ) ); // 2008-03-04

      formatter1.setLenient( false );
      System.out.println( formatter1.parse( "29-02-2007" ) );         //  }
    catch ( ParseException e )
    {
      e.printStackTrace();
    }
Am zweiten und dritten Beispiel lässt sich ablesen, dass das Datum auf den nächsten Monat »rollt«. Mit setLenient(false) gibt es für den 29.02.2007 eine ParseException:
    2008-02-29
    2007-03-01
    2008-03-04
    java.text.ParseException: Unparseable date: "29-02-2007"
      at java.text.DateFormat.parse(DateFormat.java:357)
      at com.tutego.insel.date.ParseLenient.main(ParseLenient.java:17)
Der 29.02.2008 ist in Ordnung, weil 2008 ein Schaltjahr ist. #### Parsen und Formatieren ab bestimmten Positionen * Von den Methoden format() und parse() gibt es zwei Varianten, mit denen Teile eines Strings ausgegeben oder formatiert werden können. Zur Kapselung der Position dient ein neues Objekt, ParsePosition. Diese Klasse nutzt format() intern, um beim Parse-Prozess die aktuelle Position zu verwalten.
    abstract class java.text.DateFormat
    extends Format
    implements Cloneable, Serializable
abstract Date parse(String source, ParsePosition pos) throws ParseException Zerlegt einen Datums- oder einen Zeit-String und beginnt beim Parsen ab einer vorgegebenen Position. Abbildung 4.7: UML-Diagramm der einfachen Klasse ParsePosition ### Ihr Kommentar Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen. >> Zum Feedback-Formular
<< zurück | <top> | vor >>
Zum Katalog
Java 7 – Mehr als eine Insel Jetzt bestellen
Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen? Ihre Meinung
Buchempfehlungen
| Java und XML
| Einstieg in Eclipse 3.7
| Android 3
| NetBeans Platform 7
| Java ist auch eine Insel
| Apps entwickeln für Android 4
| Java 7
Shopping
Versandkostenfrei bestellen in Deutschland und Österreich Info

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

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