Monat rausfinden, jahr woche und tag bekannt [PHP]

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Nussmischung
Mitglied
Beiträge: 4
Registriert: 22.02.2006 15:22

Monat rausfinden, jahr woche und tag bekannt [PHP]

Beitrag 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
Nussmischung
Mitglied
Beiträge: 4
Registriert: 22.02.2006 15:22

Beitrag 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
Benutzeravatar
chriss713
Mitglied
Beiträge: 229
Registriert: 06.06.2005 14:06

Beitrag 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
Nussmischung
Mitglied
Beiträge: 4
Registriert: 22.02.2006 15:22

Beitrag 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...
fagus
Mitglied
Beiträge: 71
Registriert: 30.03.2004 16:55

Beitrag 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.
Benutzeravatar
MagMo
Ehemaliges Teammitglied
Beiträge: 584
Registriert: 30.10.2005 16:06
Wohnort: Köln
Kontaktdaten:

Beitrag 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
Benutzeravatar
chriss713
Mitglied
Beiträge: 229
Registriert: 06.06.2005 14:06

Beitrag 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.
Benutzeravatar
MagMo
Ehemaliges Teammitglied
Beiträge: 584
Registriert: 30.10.2005 16:06
Wohnort: Köln
Kontaktdaten:

Beitrag 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.
Zuletzt geändert von MagMo am 24.02.2006 11:20, insgesamt 1-mal geändert.
Nussmischung
Mitglied
Beiträge: 4
Registriert: 22.02.2006 15:22

Beitrag 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.. ;)
Antworten

Zurück zu „Coding & Technik“