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.7 Formatieren und Parsen von Datumsangaben Zur nächsten ÜberschriftZur vorigen Überschrift

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.


Galileo Computing - Zum Seitenanfang

13.7.1 Ausgaben mit printf() Zur nächsten ÜberschriftZur vorigen Überschrift

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 13.14 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. [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 Reihenfolgenden definiert, die die API-Dokumentation zeigt. So ist %tD nichts anderes als eine Abkürzung für %tm/%td/%ty.


Galileo Computing - Zum Seitenanfang

13.7.2 Mit DateFormat und SimpleDateFormat formatieren Zur nächsten ÜberschriftZur vorigen Überschrift

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.

Listing 13.15 com/tutego/insel/date/SimpleDateFormatDemo.java, main()

Calendar cal = Calendar.getInstance(); 
DateFormat formatter = new SimpleDateFormat(); 
System.out.println( formatter.format(cal.getTime()) ); // 09.06.06 14:00 
System.out.printf( "%tT", cal );                       // 14:00:09

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!

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 Funktionen 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 Funktionen Argumente für Präzisionen mitgeben, und zwar DateFormat.SHORT, DateFormat.MEDIUM, DateFormat.LONG oder DateFormat.FULL. Diese drei Angaben ermöglichen es, dass die Zeit beziehungsweise das Datum sich auf vier Arten formatieren lässt.


Tabelle 13.2 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 13.16 com/tutego/insel/date/DateTimeInstance.java, main()

Date d = new Date(); 
 
DateFormat df; 
 
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 Funktionen, 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 13.17 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 13.3 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 13.4 Symbole im Formatierungsstring zur Steuerung der Ausgabe

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.

Galileo Computing - Zum Seitenanfang

13.7.3 Parsen von Datumswerten topZur vorigen Überschrift

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-catch-Block oder der Fehler muss anderweitig weitergeleitet werden.


Beispiel Parse eine einfache Datums-Repräsentation. Erzeuge dann vom Datumsobjekt eine String-Repräsentation, und parse diese wieder.

Listing 13.18 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 dann doch immer eine ParseException sicher, auch wenn nur die Sekunden fehlen. Trotz 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() – der Nachsichtige

Unsinnige Werte meckert parse() standardmäßig nicht an, wie die folgenden Zeilen dar-legen:

DateFormat formatter = new SimpleDateFormat( "dd-MM-yyyy" ); 
System.out.println( formatter.parse("29-02-2008") ); // Fri Feb 29 00:00:00 CET 2008 
System.out.println( formatter.parse("29-02-2007") ); // Thu Mar 01 00:00:00 CET 2007 
System.out.println( formatter.parse("33-02-2008") ); // Tue Mar 04 00:00:00 CET 2008

An den beiden letzten Beispielen lässt sich ablesen, dass das Datum auf den nächsten Monat »rollt«. Um das abzusichern, bietet DateFormat eine Methode setLenient(boolean), die den »Mildmodus« mit setLenient(false) ausschaltet.

DateFormat formatter = new SimpleDateFormat( "dd-MM-yyyy" ); 
formatter.setLenient( false ); 
System.out.println( formatter.parse( "29-02-2007" ) );

Jetzt gibt es für den 29.02.2007 eine ParseException mit dem Text »Unparseable date: "29-02-2007"«. 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. Dieses 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.


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