Timestamp aus KW, Wochentag und Jahr bilden

schleckerbeck

Erfahrenes Mitglied
Hallo,

hab jetzt schon ne Weile gesucht, jedoch nicht das gefunden was ich brauche.
Ich möchte, wie der Titel schon sagt, einen Timestamp generieren. Und zwar hab ich folgende Vorgaben:

KW 23
Jahr 2008
Wochentag Dienstag
Uhrzeit 12:00:00

Jemand ne Idee? Hab mich auch schon rumgeplagt mit strtotime, jedoch wird da halt das amerikanische Zeitsystem benutzt.

Danke, sc.
 
Müsste so eigentlich funktionieren:

PHP:
$tage = array('Montag' => 1, 'Dienstag' => 2, 'Mittwoch' => 3, 'Donnerstag' => 4, 'Freitag' => 5, 'Samstag' => 6, 'Sonntag' => 7);

$wt = $tage['Dienstag'];
$kw = 23;
$jahr = 2008;
$zeit = '12:00:00';

list($h, $m, $s) = explode(':', $zeit);

$time = mktime($h, $m, $s, 1, 1 + 7*($kw-1), $jahr);

$tmp = date('w', $time);
$tmp = ($tmp == 0) ? 7 : $tmp; // date(w) gibt 0 für Sonntag

$time = $time + 86400*($wt - $tmp); // 86400 = 60 * 60 * 24
 
Nabend,
das ist nach der internationalen Norm ISO 8601, nach der sich die deutschsprachige Kalender-Industrie ausnahmslos richtet, nicht ganz richtig. Diese besagt nämlich, dass die erste Kalenderwoche diejenige ist, die mindestens 4 Tage des neuen Jahres enthält. Aufgrund dieser Definition kann man sicher sagen, dass der 4. Januar zur ersten Kalenderwoche gehört. Daher kann man den Montag einer bestimmten Kalenderwoche mit folgender Funktion bestimmen:
PHP:
function kalenderwoche($kw, $year) {
	$time = strtotime("4 January " . $year);
	if (date('w', $time) != 1)
		$time = strtotime("last Monday", $time);
	$time = strtotime("+" . ($kw - 1) . " weeks", $time);
	
	return $time;
}

Das Datum eines gegebenen Tages in einer bestimmten KW kannst du dann so ausfindig machen:
PHP:
echo date('d.m.Y', strtotime('next Tuesday', kalenderwoche(23, 2008)));

Gruß
Marvin
 
Warum setzt du nicht einfach via [phpf]setlocale[/phpf] zumindest LC_TIME auf Deutsch? Das sollte, sofern die korrekten Daten vorliegen (Auf den meisten Linux-Distributionen generell der Fall, bei MS erfahrungsgemäß eine Glückssache), auch zu korrekten Ergebnissen bei der zur Zeit nicht funktionierenden Lösung führen.
 
Danke für die Antworten.
@marvin: Dein Ansatz gefällt mir schon sehr gut, doch wie bring ich da noch die Zeit, z.B. 12:00:00 mit rein?
 
Moin,
die Zeit kannst du so noch miteinbringen:
PHP:
$datum = date('d.m.Y', strtotime('next Tuesday', kalenderwoche(23, 2008)));
$zeit = '12:00:00';
list($hrs, $mins, $secs) = explode(':', $zeit);
list($d, $m, $y) = explode('.', $datum);
$time = mktime($hrs, $mins, $secs, $m, $d, $y);
Das liefert dir einen Zeitstempel des ermittelten Datums zu gegebener Uhrzeit.

maeTimmae: Auf welchen Beitrag bezieht sich deine Aussage?

Schönen Gruß
Marvin
 
Danke, jetzt funktionierts!

Hier nochmal der komplette Code, falls Ihn jemand braucht (hab noch die deutschen Wochentagsnamen eingebaut):
PHP:
function kw($tag,$zeit,$kw,$year)
{
	$tage=array("Montag"=>"Monday", "Dienstag"=>"Tuesday", "Mittwoch"=>"Wednesday", "Donnerstag"=>"Thursday", "Freitag"=>"Friday", "Samstag"=>"Saturday", "Sonntag"=>"Sunday");
	$tag=$tage[$tag];
	$time = strtotime("4 January " . $year);
	if(date('w', $time) != 1)
	{
		$time = strtotime("last Monday", $time);
	}
	$time = strtotime("+" . ($kw - 1). " weeks", $time);

	$datum = date('d.m.Y', strtotime('next '.$tag, $time)); 
	list($hrs, $mins, $secs) = explode(':', $zeit); 
	list($d, $m, $y) = explode('.', $datum); 
	$time = mktime($hrs, $mins, $secs, $m, $d, $y);
	return $time;
} 
echo kw("Freitag","14:31:00","48","2007");

Gruß,
sc.
 
Das wird so nicht ganz funktionieren, da Marvins Funktion kalenderwoche wie von ihm beschrieben den Montag der gesuchten Kalenderwoche zurückgibt. Wenn du von dort aus zum nächsten Montag springst, bist du beim Montag der folgenden Woche. Du könntest die Funktion statt auf "last Monday" auf "last Sunday" zurückspringen lassen, von dort aus passt es wieder. Außerdem kannst du die Uhrzeit auch etwas einfacher anhängen, auch alles mit strtotime möglich:

PHP:
function kw($tag,$zeit,$kw,$year)
{
    $tage = array("Montag"=>"Monday", "Dienstag"=>"Tuesday", "Mittwoch"=>"Wednesday", "Donnerstag"=>"Thursday", "Freitag"=>"Friday", "Samstag"=>"Saturday", "Sonntag"=>"Sunday");
    $tag = $tage[$tag];
    $time = strtotime("4 January " . $year);
    $time = strtotime("last Sunday", $time);
    $time = $time + ($kw - 1)*7;

    return strtotime('next '.$tag.' '.$zeit, $time);
}
echo date('d.m.Y - H:i:s', kw("Donnerstag","14:31:00","1","2011"));

Das mein Vorschlag so falsch war hätte wirklich nicht sein müssen... ich hab während des Schreibens genau das Problem gehabt, habe mir den Januar 2008 angesehen und dann von einer Stichprobe auf alle anderen Jahre geschlossen. Dass ich weder vernünftig danach gesucht habe, noch dich auf meine Annahme hingewiesen habe ärgert mich jetzt wirklich. Leider lässt sich meine Idee nicht mehr so einfach an dieses Problem anpassen, daher kann ich dir auch nur die Funktion von Marvin empfehlen, sehr schöner Ansatz mit strtotime. Man lernt hier eben nie aus, egal ob als fragender oder als antwortender ;)
 
Zurück