# Wochentag eines Datums ermitteln



## Gayson (9. Aug 2004)

Guten Tag!

Ich habe mal versucht, mich ein bisschen durch JCalender, JGregorianCalender und JDate durchzufummeln, leider jedoch ergebnislos.

Was ich erreichen möchte ist, dass wenn ich einer Methode ein Datum übergebe, dass das Programm mir den deutschen zugehörigen Wochentag ausspuckt.

Könntet ihr mir hierzu einen kleinen Tip geben?

Danke!!


----------



## P3AC3MAK3R (9. Aug 2004)

Auszug aus dem API:


```
// get the supported ids for GMT-08:00 (Pacific Standard Time)
 String[] ids = TimeZone.getAvailableIDs(-8 * 60 * 60 * 1000);
 // if no ids were returned, something is wrong. get out.
 if (ids.length == 0)
     System.exit(0);

  // begin output
 System.out.println("Current Time");

 // create a Pacific Standard Time time zone
 SimpleTimeZone pdt = new SimpleTimeZone(-8 * 60 * 60 * 1000, ids[0]);

 // set up rules for daylight savings time
 pdt.setStartRule(Calendar.APRIL, 1, Calendar.SUNDAY, 2 * 60 * 60 * 1000);
 pdt.setEndRule(Calendar.OCTOBER, -1, Calendar.SUNDAY, 2 * 60 * 60 * 1000);

 // create a GregorianCalendar with the Pacific Daylight time zone
 // and the current date and time
 Calendar calendar = new GregorianCalendar(pdt);
 Date trialTime = new Date();
 calendar.setTime(trialTime);

 // print out a bunch of interesting things
 System.out.println("ERA: " + calendar.get(Calendar.ERA));
 System.out.println("YEAR: " + calendar.get(Calendar.YEAR));
 System.out.println("MONTH: " + calendar.get(Calendar.MONTH));
 System.out.println("WEEK_OF_YEAR: " + calendar.get(Calendar.WEEK_OF_YEAR));
 System.out.println("WEEK_OF_MONTH: " + calendar.get(Calendar.WEEK_OF_MONTH));
 System.out.println("DATE: " + calendar.get(Calendar.DATE));
 System.out.println("DAY_OF_MONTH: " + calendar.get(Calendar.DAY_OF_MONTH));
 System.out.println("DAY_OF_YEAR: " + calendar.get(Calendar.DAY_OF_YEAR));
 System.out.println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK));
 System.out.println("DAY_OF_WEEK_IN_MONTH: "
                    + calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));
 System.out.println("AM_PM: " + calendar.get(Calendar.AM_PM));
 System.out.println("HOUR: " + calendar.get(Calendar.HOUR));
 System.out.println("HOUR_OF_DAY: " + calendar.get(Calendar.HOUR_OF_DAY));
 System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE));
 System.out.println("SECOND: " + calendar.get(Calendar.SECOND));
 System.out.println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND));
 System.out.println("ZONE_OFFSET: "
                    + (calendar.get(Calendar.ZONE_OFFSET)/(60*60*1000)));
 System.out.println("DST_OFFSET: "
                    + (calendar.get(Calendar.DST_OFFSET)/(60*60*1000)));

 System.out.println("Current Time, with hour reset to 3");
 calendar.clear(Calendar.HOUR_OF_DAY); // so doesn't override
 calendar.set(Calendar.HOUR, 3);
 System.out.println("ERA: " + calendar.get(Calendar.ERA));
 System.out.println("YEAR: " + calendar.get(Calendar.YEAR));
 System.out.println("MONTH: " + calendar.get(Calendar.MONTH));
 System.out.println("WEEK_OF_YEAR: " + calendar.get(Calendar.WEEK_OF_YEAR));
 System.out.println("WEEK_OF_MONTH: " + calendar.get(Calendar.WEEK_OF_MONTH));
 System.out.println("DATE: " + calendar.get(Calendar.DATE));
 System.out.println("DAY_OF_MONTH: " + calendar.get(Calendar.DAY_OF_MONTH));
 System.out.println("DAY_OF_YEAR: " + calendar.get(Calendar.DAY_OF_YEAR));
 System.out.println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK));
 System.out.println("DAY_OF_WEEK_IN_MONTH: "
                    + calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));
 System.out.println("AM_PM: " + calendar.get(Calendar.AM_PM));
 System.out.println("HOUR: " + calendar.get(Calendar.HOUR));
 System.out.println("HOUR_OF_DAY: " + calendar.get(Calendar.HOUR_OF_DAY));
 System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE));
 System.out.println("SECOND: " + calendar.get(Calendar.SECOND));
 System.out.println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND));
 System.out.println("ZONE_OFFSET: "
        + (calendar.get(Calendar.ZONE_OFFSET)/(60*60*1000))); // in hours
 System.out.println("DST_OFFSET: "
        + (calendar.get(Calendar.DST_OFFSET)/(60*60*1000))); // in hours
```

Mit


```
SimpleTimeZone pdt = new SimpleTimeZone(-8 * 60 * 60 * 1000, ids[0]);
Calendar calendar = new GregorianCalendar(pdt);
```

erzeugst Du einen Kalender.

Mit


```
System.out.println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK));
```

solltest Du das gewünschte Ergebnis erhalten.

[Edit]Die Zeitzone muß dann natürlich noch angepaßt werden.[/Edit]


----------



## thE_29 (9. Aug 2004)

```
SimpleDateFormat formata = new SimpleDateFormat("EEEE, dd.MMMM yyyy"); // EEEE = WOCHENTAG
    formata.setTimeZone(TimeZone.getTimeZone("CET"));
    String strAktDate = formata.format(aktDate);
```

prob das setzen der TimeZone mal


----------



## Gayson (9. Aug 2004)

Bei Peacemakers Code versteh ich nicht, wo denn da ein spezielles Datum eintragen kann.
Liefert calendar.get(Calendar.DAY_OF_WEEK) nicht den aktuellen Wochentag? Und bei der TimeZone lässt sich doch nur die Zeitverschiebung einstellen, oder? Wie kann ich hiermit den Wochentag eines beliebigen Datums herausfinden.

Und thE_29 Code kapier ich gar nicht, wäre toll, wenn du mir ne kurze Erklärung dafür geben könntest.


----------



## bygones (9. Aug 2004)

Gayson hat gesagt.:
			
		

> Und thE_29 Code kapier ich gar nicht, wäre toll, wenn du mir ne kurze Erklärung dafür geben könntest.


SimpleDateFormat formatiert dir das Datum so wie du es im Konstruktor angibst (schau dazu in der Api nach)...
danach setzt er die entsprechende Zeitzone und gibt dann das Format für das aktuelle Datum aus..

wahrscheinlich is es so besser:

```
System.out.println(formata.format(new Date());
```
probier das mal aus und schau dir das Ergebnis an


----------



## P3AC3MAK3R (9. Aug 2004)

Gayson hat gesagt.:
			
		

> Bei Peacemakers Code versteh ich nicht, wo denn da ein spezielles Datum eintragen kann.
> Liefert calendar.get(Calendar.DAY_OF_WEEK) nicht den aktuellen Wochentag? Und bei der TimeZone lässt sich doch nur die Zeitverschiebung einstellen, oder? Wie kann ich hiermit den Wochentag eines beliebigen Datums herausfinden.


Ein Datum kannst Du mit der setTime-Methode der Klasse Calendar festlegen. TimeZone ist die Zeitzone, welche noch abgeändert werden muß.


----------



## Gayson (9. Aug 2004)

```
SimpleDateFormat formata = new SimpleDateFormat("EEEE, dd.MMMM yyyy"); // EEEE = WOCHENTAG
formata.setTimeZone(TimeZone.getTimeZone("CET"));
System.out.println(formata.format(new Date()));
```

Dieser Code klappt hervorragend, ich verstehe ihn jetzt sogar ein wenig mehr. Doch wie kann ich ein beliebiges Datum anzeigen lassen?
Muss man wahrscheinlich in der letzten Zeile bei new Date() was ändern, aber ich weiß leider nicht, was.


----------



## bygones (9. Aug 2004)

was meinst du mit "jedes beliebige Datum" ??
wenn es ums Format geht dann musst du dir einen entsprechenden SimpleFormatter bauen...

oder meinst du dass es immer aktuell ist ?
das macht der Aufruf new Date() automatisch:

```
Mon Aug 09 15:28:23 CEST 2004
```


----------



## P3AC3MAK3R (9. Aug 2004)

Gayson hat gesagt.:
			
		

> ```
> SimpleDateFormat formata = new SimpleDateFormat("EEEE, dd.MMMM yyyy"); // EEEE = WOCHENTAG
> formata.setTimeZone(TimeZone.getTimeZone("CET"));
> System.out.println(formata.format(new Date()));
> ...


In diesem Fall müßtest Du einen anderen Date-Konstruktor verwenden:

http://java.sun.com/j2se/1.4.2/docs/api/java/sql/Date.html#constructor_detail


----------



## bygones (9. Aug 2004)

P3AC3MAK3R hat gesagt.:
			
		

> In diesem Fall müßtest Du einen anderen Date-Konstruktor verwenden:
> http://java.sun.com/j2se/1.4.2/docs/api/java/sql/Date.html#constructor_detail


 ???:L  reden wir hier vom sql.Date oder util.Date ??


----------



## thE_29 (9. Aug 2004)

also, da es eigentlich von mir ist, ist es util.Date und nicht sql!!!

http://java.sun.com/j2se/1.4.2/docs/api/java/util/Date.html#constructor_detail


----------



## P3AC3MAK3R (9. Aug 2004)

deathbyaclown hat gesagt.:
			
		

> P3AC3MAK3R hat gesagt.:
> 
> 
> 
> ...


Ups, falschen Link angeklickt.

Hier ist der richtige:
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Date.html#constructor_detail


----------



## Gayson (9. Aug 2004)

> was meinst du mit "jedes beliebige Datum" ??


Ich möchte erreichen, dass zu einem Datum, welches ich angebe, der dazugehörige Wochentag "ausgespuckt" wird.



> In diesem Fall müßtest Du einen anderen Date-Konstruktor verwenden:


Wenn ich es also richtig verstanden habe, müsste

```
System.out.println(formata.format(new Date(long milliseconds)));
```
den Wochentag eines beliebigen Datums ausgeben?

Gibt es dafür auch eine Methode (Datum --> Millisekunden), oder muss man sich dafür ne Formel kreieren (was meiner Meinung nach mit den Schaltjahren ein wenig komplizierter werden dürfte, oder)?


----------



## bygones (9. Aug 2004)

du kannst auch a weng mit dem SImpleDateFormat spielen - da geht es nämlich auch in die andere Richtung:

```
public static void main( String[] args ) throws ParseException {
        SimpleDateFormat dayFormat = new SimpleDateFormat( "EEEE" );
        SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy");
        String date = "22.08.1989";
        System.out.println(date + " was a " + dayFormat.format( format.parse(date) ));
    }
```


----------



## Gayson (9. Aug 2004)

Jawoll, das klappt super!

Danke an alle für die wirklich schnelle Hilfe!!


----------



## bygones (9. Aug 2004)

achja - vergess am besten nicht

```
format.setLenient(false);
```
ansonsten parst er 
	
	
	
	





```
String date = "35.08.1989";
```
 das datum auch !


----------



## Gayson (9. Aug 2004)

Tut mir leid, ich brauche nocmal kurz eure Hilfe.
Wie kann ich erfragen, ob ein bestimmtes Jahr ein Schaltjahr ist?

Ich brauche so etwas wie:


```
if (2004=Schaltjahr)
System.out.println("2004 ist ein Schaltjahr";
```

Bestimmt ganz simpel, gibt es solch ein boolean vielleicht sogar in Date?
Oder vielleicht eine Methode, mit der man die Tage eines Jahres bestimmen könnte (so kann man ja dann daraus schließen, ob Schaltjahr oder nicht).

Sonst schreib ich ne Formel, ist zwar net schwer, aber ich dachte, es könnte etwas eleganter gehen...


----------



## Gayson (9. Aug 2004)

Habe mich mal danach umgeguckt, wie man einm Schaltjahr berechnet:



> Generell ist ein Jahr ein Schaltjahr, wenn es ohne Rest durch vier teilbar ist: So war beispielsweise 1996 ein Schaltjahr und auch 2004 wird eins sein. Eine Ausnahme bilden die vollen Jahrhunderte: Sie sind im allgemeinen keine Schaltjahre - bis auf die vollen Jahrhunderte, die durch 400 ohne Rest teilbar sind. Daher ist beispielsweise das Jahr 2000 ein Schaltjahr.



Und hier die Formel, die ich mir hierzu ausgedacht hab.
Wenn ihr ein Fehler findet, sagt bitte Bescheid!


```
if((chosenYear % 100)!=0 && ((chosenYear % 4)==0)){
			System.out.println(chosenYear + " ist ein Schaltjahr");
		}
		else if ((chosenYear % 400)==0){
			System.out.println(chosenYear + " ist ein Schaltjahr");
		}
		else {
			System.out.println(chosenYear + " ist kein Schaltjahr");
		}
```


----------



## Illuvatar (9. Aug 2004)

http://java.sun.com/j2se/1.5.0/docs/api/java/util/GregorianCalendar.html#isLeapYear(int)


----------



## Gayson (9. Aug 2004)

Grrr, aber gut, ich nehm jetzt trotzdem meins.
Danke!


----------



## Illuvatar (10. Aug 2004)

:bae:


----------

