Seite 1 von 2

Monat rausfinden, jahr woche und tag bekannt [PHP]

Verfasst: 22.02.2006 15:30
von Nussmischung
Hi,
bin auf der suche nach einer möglichkeit den Monat rauszufinden, wenn das Jahr, die Woche und der Tag bekannt ist.

habe es schon so probiert:

Code: Alles auswählen

date('d.m.Y', strtotime("+$week week", mktime(0,0,0,1,$day-6,$year)))
das klappt soweit für dieses jahr auch ganz gut, aber bei year++ stimmt der tag nicht mehr.. und warum es nur mit $day-6 klappt hab ich auch nich gecheckt :)

wenn jemand ne lösung hat, immer her damit!


Gruß, Nussmischung

Verfasst: 23.02.2006 11:45
von chriss713

Verfasst: 23.02.2006 12:50
von Nussmischung
toller link..
die funktion "getWeekNoByDay" bringt mich aber auch nicht weiter.. Wie du sicherlich gelesen bin ich auf der suche nach dem Monat und nicht nach der Woche

Verfasst: 23.02.2006 13:45
von chriss713
Sorry, mein Fehler! :roll:

Was genau meinst Du mit "Tag"? Den x-ten Tag der Woche? des Monats? des Jahres?

Mit Hilfe dieses Links sollte es nicht so schwer sein, einen Algorithmus zu bauen: http://de.wikipedia.org/wiki/Kalenderwo ... enderwoche

Verfasst: 23.02.2006 13:57
von Nussmischung

Code: Alles auswählen

$year = 2006;
$week = 8;
$day = 4; // (Sonntag=0, Montag=1...)

// was kann ich nun machen, damit ich 23.02.2006 bekomme 
das sind jetzt mal beispielwerte für die variablen...

Verfasst: 23.02.2006 15:16
von fagus
huhu,

das problem sollte eigentlich schon lösbar sein. doch es verlangt schon etwas überlegungsarbeiten, da es ein paar fallstricke beinhaltet.

problem nr.1:
der 1. januar ist noch woche 52, da er eben mitten in der woche ist. die woche 1 fängt mir dem ersten wochentag im neuen jahr an.

das jahr beginnt mit woche 1. somit sind in der woche 8 nur 7 wochen vergangen und die anzahl tage der aktuellen woche und die anzahl tage im neuen jahr vor der woche 1.

lösungsansatz:
- wochentag am 1.1. ermitteln
- wochen in tage umwandeln
- anzahl vergangener tage im neuen jahr berechnen unter berücksichtigung des wochentags am 1.1. und dem dem aktuellen wochentag

in code könnte das etwa wie folgt umgesetzt werden:

Code: Alles auswählen

$year = 2006;
$week = 8;
$day = 4;

// Wochentag am 1. Januar ermitteln
$wochentag = myfunction_get_weekday(1,1,$year);

$anzahl_tage = $wochentag+($week-1)*7+$day;
die myfunction_get_weekday() sollte mit der entsprechenden php-funktion ersetzt werden, welche den wochentag für ein bestimmtes datum liefert. die formel, die die anzahl tage berechnet sollte überprüft werden ob sie stimmt und wenn nicht entsprechend korrigiert werden.

was jetzt noch fehlt, eine korrektur, falls das datum in der woche 52 oder 53 aber schon im neuen jahr ist und eine funktion die aus den tagen in der variable $anzahl_tagen den monat ermittelt. notfalls könnte diese auch selber geschrieben werden, allerdings liegt das problem hier bei der ermittlung der schaltjahre, welche wiederum korrekturarbeit erfordert.

Verfasst: 23.02.2006 21:22
von MagMo
Hi,

als erstes muss du ermitteln wie viele Tage vor Beginn der ersten Woche vergangen sind, da die erste Woche immer am ersten Montag des Jahres beginnt:

Code: Alles auswählen

$TveW = mktime(12,0,0,1,1,$year);
$TveW = date('w', $TveW);
if ($TveW == 0)
{
 $TveW = 7;
}
elseif ($TveW == 1)
{
 $TveW = 8;
}
$TveW = 8 - $TveW;
Die Variable $TveW enthält nun die Tage vor Beginn der ersten Woche.

Als nächstes ermittelst du welcher Tag des Jahres der angegebene Tag ist:

Code: Alles auswählen

if ($day == 0)
{
 $day = 7;
}
$TdJ = $TveW + (($week - 1) * 7) + $day;
Wie fagus schon sagte ist die angegebene Woche noch nicht rum, daher muss $week um eins reduziert werden. Dann noch die Tage von der laufenden Woche hinzuzählen (Wenn der Tag ein Sonntag ist müssen 7 und nicht 0 Tage hinzuaddiert werden.) sowie die Tage vor der ersten Woche.

Mit mktime() und date() lässt du dir nun den Monat ausgeben:

Code: Alles auswählen

$Monat = date('n', mktime(12,0,0,1,$TdJ,$year);
Die Funktion mktime() macht aus dem 54.1.2006 automatisch den 23.2.2006.

Ich hoffe ich habe da jetzt keinen Gedankenfehler gemacht.

Bei der Aussage "da die erste Woche immer am ersten Montag des Jahres beginnt" habe ich mich auf fagus verlassen, weiß nicht ob dies wirklich stimmt (habe mir da erlich gesagt noch nie Gedanken drüber gemacht). :)

Grüße
MagMo

Verfasst: 23.02.2006 21:36
von chriss713
MagMo hat geschrieben:Bei der Aussage "da die erste Woche immer am ersten Montag des Jahres beginnt" habe ich mich auf fagus verlassen, weiß nicht ob dies wirklich stimmt
Genau da liegt aber meines Erachtens der Hund begraben, laut Wikipedia gibts da mehrere Möglichkeiten:
Die erste Woche des Jahres ist
jene,
- in die der 1. Januar fällt (Excel-Funktion "Kalenderwoche")
- die erste vollständige Woche des Jahres
- die erste Woche, in die mindestens vier Tage des neuen Jahres fallen (ISO 8601)
Und weiter heißt es da
Die deutschsprachige Kalender-Industrie hält sich ausnahmslos an die internationale Norm ISO 8601 (1973) [...]. Als „KW 1“ eines Jahres gilt der genannten Norm zur Folge die Woche, die den 4. Januar enthält.

Verfasst: 23.02.2006 22:21
von MagMo
Hi,
chriss713 hat geschrieben:Und weiter heißt es da
Die deutschsprachige Kalender-Industrie hält sich ausnahmslos an die internationale Norm ISO 8601 (1973) [...]. Als „KW 1“ eines Jahres gilt der genannten Norm zur Folge die Woche, die den 4. Januar enthält.
Wenn das so ist, dann funktioniert obiges leider nicht. :-?

Wenn die erste Woche des Jahres die Woche ist in der der 4.1. liegt, dann sollte folgendes funktionieren:

Code: Alles auswählen

// Welcher Wochentag ist der 4.1.xxxx?
$Wt41 = mktime(12,0,0,1,4,$year); 
$Wt41 = date('w', $Wt41);

// Den benötigten Faktor festlegen (abhängig vom Wochentag des 4.1.).
if ($Wt41 == 1)
{
 $Wt41 = 3;
}
elseif ($Wt41 == 2)
{
 $Wt41 = 2;
}
elseif ($Wt41 == 3)
{
 $Wt41 = 1;
}
elseif ($Wt41 == 4)
{
 $Wt41 = 0;
}
elseif ($Wt41 == 5)
{
 $Wt41 = -1;
}
elseif ($Wt41 == 6)
{
 $Wt41 = -2;
}
else
{
 $Wt41 = -3;
}

// Der wievielte Tag des Jahres ist der gesuchte Tag?
if ($day == 0) 
{ 
 $day = 7; 
}
$TdJ = $Wt41 + (($week - 1) * 7) + $day;

// Datum erstellen und daraus den Monat ermitteln.
$Monat = date('n', mktime(12,0,0,1,$TdJ,$year));
Grüße
MagMo

EDIT:
2 fehlende Semikolons und eine fehlende schließende Klammer zum Code hinzugefügt.

Verfasst: 24.02.2006 09:19
von Nussmischung
habe es gestern nachmittag schon gelöst. in einem anderem Forum hat jemand das hier gepostet und das funktioniert soweit sehr gut!

Code: Alles auswählen

$jahr = 2006;
$woche = 8;
$tag = 4;

$newTime = strtotime("+".$woche." weeks", strtotime("01 January ".$jahr));
$newTime = strtotime("+".($tag - date('w', $newTime))." days", $newTime);
$newTime = (date('W', $newTime) != $woche) ? strtotime("-1 weeks", $newTime) : $newTime;
trotzdem vielen dank für eure bemühungen.. ;)