Advanced Java Services | Date, Calendar |
Für die Klasse Date benötigt man das Import java.util.*;
Wichtige Konstruktoren | |
---|---|
Date() |
Allocates a Date object and initializes it so that it represents the time at which it was allocated, measured to the nearest millisecond. |
Date(long date) |
Allocates a Date object and initializes it to represent the specified number of milliseconds since the standard base time known as "the epoch", namely January 1, 1970, 00:00:00 GMT. |
Wichtige Methoden | |
---|---|
Returntyp | Name der Methode |
boolean |
after(Date when) Tests if this date is after the specified date. |
boolean |
before(Date when) Tests if this date is before the specified date. |
Object |
clone() Return a copy of this object. |
int |
compareTo(Date anotherDate) Compares two Dates for ordering. |
boolean |
equals(Object obj) Compares two dates for equality. |
long |
getTime() Returns the number of milliseconds since January 1, 1970, 00:00:00 GMT represented by this Date object. |
void |
setTime(long time) Sets this object to represent a point in time that is time milliseconds after January 1, 1970 00:00:00 GMT. |
String |
toString() Converts this Date object to a String of the form: dow mon dd hh:mm:ss zzz yyyy |
Das aktuelle Datum bekommt man mit
Date curr = new Date(); System.out.println(curr.toString()); //Mon Jul 28 14:20:20 CEST 2003
Das Ausgabeformat steht im Kommentar. Das folgende Beispiel demonstriert einige der Methoden.
import java.util.*; public class DateDemo { public static void main(String[] args) { Date date1 = new Date(); System.out.println("date1 = "+date1); try{ Thread.sleep(2000); } catch(Exception ex){} Date date2 = new Date(); System.out.println("before "+ date1.before(date2) ); // true Date date3 = (Date)date1.clone(); System.out.println("equals "+ date1.equals(date3) ); // true long millis = date2.getTime() ; Date date4 = new Date(millis - 10000) ; System.out.println("date2 = "+date2); System.out.println("date4 = "+date4); // 10 Sekunden früher } }
Mit der Klasse DateFormat aus dem Paket java.text. kann man ein Dateobjekt für die Ausgabe formatieren. Dazu holt man sich mit der statischen Methode getDateInstance() ein DateFormatobjekt und übergibt der Methode format das zu formatierende Datum:
import java.util.*; import java.text.*; public class DateDemo2 { public static void main(String[] args) { Date date = new Date(); DateFormat df = DateFormat.getDateInstance() ; String formattedDate = df.format(date) ; System.out.println(formattedDate); // tt.mm.jjjj } }
DateFormat verfügt über eine zweite statische Methode getDateInstance(), der man den Stil der Formatierung übergeben kann (siehe Übungen).
Für die Klasse Calendar benötigt man das Import java.util.*;
Wichtige Methoden | |
---|---|
Returntyp | Name der Methode |
static Calendar |
getInstance() Gets a calendar using the default time zone and locale. Statische Methode als Ersatz für Konstruktor. |
static Calendar |
getInstance(Locale aLocale) Gets a calendar using the default time zone and specified locale. Statische Methode als Ersatz für Konstruktor. |
abstract void |
add(int field, int amount) Date Arithmetic function. |
boolean |
after(Object when) Compares the time field records. |
boolean |
before(Object when) Compares the time field records. |
boolean |
equals(Object obj) Compares this calendar to the specified object. |
int |
get(int field) Gets the value for a given time field. |
Date |
getTime() Gets this Calendar's current time. |
void |
set(int field, int value) Sets the time field with the given value. |
void |
set(int year, int month, int date) Sets the values for the fields year, month, and date. Die methode ist so überladen, daß man zusätzlich noch die Stunde, die Minute und die Sekunde setzen kann. |
void |
setTime(Date date) Sets this Calendar's current time with the given Date. |
Calendar ist der Nachfolger der Klasse Date, ersetzt aber die Klasse Date nicht vollständig. Date hat eine ganze Reihe von Methoden, die deprecated sind und für die auf Methoden der Klasse Calendar verwiesen wird. Calendar ist eine abstrakte Klasse, hat aber, wie bei manchen abstrakten Klassen üblich, statische Methoden als Konstruktorersatz. Diese liefern ein Objekt einer Klasse, die die abstrakte Klasse Calendar realisiert hat. Es gibt auch eine konkrete Unterklasse von Calendar, die Klasse GregorianCalendar. Diese Klasse hat sieben verschiedene Konstruktoren zur Initialisierung ihrer Objekte. Schaut man in den Quellcode der Klasse Calendar, so sieht man daß getInstance() sich beruft auf eine private Methode namens createCalendar() und diese wiederum legt in den meisten Ländern der Erde ein Objekt vom Typ GregorianCalendar an. Hier ein Blick in den Quellcode von Calendar:
public static Calendar getInstance() { return createCalendar(TimeZone.getDefault(), Locale.getDefault()); } private static Calendar createCalendar(TimeZone zone, Locale aLocale) { if (aLocale.getLanguage().compareTo("th") == 0) { if (aLocale.getCountry().compareTo("TH") == 0) { return new sun.util.BuddhistCalendar(zone, aLocale); } } // else create the default calendar return new GregorianCalendar(zone, aLocale); }
Für Europa ist liefert also
Calendar cal = Calendar.getInstance();
das gleiche Objekt wie
GregorianCalendar greg = new GregorianCalendar(TimeZone.getDefault(), Locale.getDefault());
und zwar die aktuelle Systemzeit.
Von Date nach Calendar:
Date d = new Date(); Calendar cal = Calendar.getInstance().setTime(d);
Von Calendar nach Date:
Calendar cal = Calendar.getInstance(); Date d = cal.getTime() ;
Achtung:
Die Monate Januar bis Dezember sind durchnumeriert von 0 bis 11.
Die Wochentage gehen nicht von Montag bis Sonntag, sondern von Sonntag bis Samstag
(Kirchenwoche...) und sind durchnumeriert von 1 bis 7.
Die Tage im Monat beginnen gottseidank mit 1.
Calendar cal = new GregorianCalendar(1789, 6, 14); // 6 = Juli // 14. Juli 1789
Einzelheiten dieses historischen Datums erhält man mit der get-Methode:
System.out.println("DATE: " + cal.get(Calendar.DATE)); // liefert 14 System.out.println("DAY_OF_MONTH: " + cal.get(Calendar.DAY_OF_MONTH));// liefert 14 System.out.println( cal.get(Calendar.MONTH) ); // liefert 6 System.out.println( cal.get(Calendar.YEAR) ); // liefert 1789 System.out.println("DAY_OF_WEEK: " + cal.get(Calendar.DAY_OF_WEEK)); // liefert 3 // 1=Sonntag, 2=Montag, 3=Dienstag
Wenn man lange genug in der API liest, dann erfährt man, daß Calendar.DATE und Calendar.DAY_OF_MONTH immer den gleichen Wert liefern. Calendar.DAY_OF_WEEK sagt uns, daß die französische Revolution an einem Dienstag begann.
Die Methode format() von DateFormat erwartet ein Dateobjekt, also verwenden wir getTime() :
Calendar cal = new GregorianCalendar(1789, 6, 14); // 6 = Juli, also 14. Juli 1789 DateFormat longFormat = DateFormat.getDateInstance(DateFormat.LONG) ; String longFormatted = longFormat.format(cal.getTime()) ; System.out.println(longFormatted); // liefert 14. Juli 1789 DateFormat fullFormat = DateFormat.getDateInstance(DateFormat.FULL) ; String fullFormatted =fullFormat.format(cal.getTime()) ; System.out.println(fullFormatted); // liefert Dienstag, 14. Juli 1789