php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
KW Datum werden nicht richtig errechnet


 
reddevil82
28-12-2008, 15:18 
 
Hallo Ihr

hoffe bin hier im richtigen Forum

Habe ein Problem mit meinem Sendeplan.

Und zwar wird da bei den Datum folgendes ausgegeben:

Sendeplan vom 28.12.2008 - 4.13.2008

Ich weiss leider nicht warum der da nicht automatisch auf den 1.1.09 springt bzw. was ich falsch am code habe.

hier mal der code


function get_monday($kw,$year = false) {
if ($year == false) $year = date("Y");
if ($kw < 0 || $kw > 53) return false;
$dayofweek = (intval(date("w",mktime(0,0,0,1,1,$year))) == 0) ? 7 : intval(date("w",mktime(0,0,0,1,1,$year)));
$dayofyear = 7*($kw-2)+(9-$dayofweek); $days = 0; $i = 1;
while (true) {
if ($days+date('t',mktime(0,0,0,$i,1,$year)) < $dayofyear) $days += date('t',mktime(0,0,0,$i++,1,$year));
else return $datum = (($dayofyear-$days < 1) ? 1 : ($dayofyear-$days)).".".($i).".$year"; } }
$kw = (int)date('W'); $j = $jahr;

function get_sunday($kw,$year = false) {
if ($year == false) $year = date("Y");
if ($kw < 0 || $kw > 53) return false;
$dayofweek = (intval(date("w",mktime(0,0,0,1,1,$year))) == 0) ? 7 : intval(date("w",mktime(0,0,0,1,1,$year)));
$dayofyear = 7*($kw-2)+(15-$dayofweek); $days = 0; $i = 1;
while (true) {
if ($days+date('t',mktime(0,0,0,$i,1,$year)) < $dayofyear) $days += date('t',mktime(0,0,0,$i++,1,$year));
else return $datum = (($dayofyear-$days < 1) ? 1 : ($dayofyear-$days)).".".($i).".$year"; } }
$kw = (int)date('W'); $j = $jahr;



$site_body .= '
<table class="contentbody" colspan="2" width="100%" cellspacing="0" cellpadding="4">
<tr>
<td class="heads"><p><b>Sendeplan für die '.$kw_aktuell.'. KW Woche vom '.get_monday($kw,$j).' bis '.get_sunday($kw,$j).'</b></p> </td>

</tr>

</table><br>';

Danke für eure Hilfe im voraus

 
Edlly
28-12-2008, 19:57 
 
also ich weiß das bei mir date diese jahr (2008) statt 53, 01 bei der KW ausgibt. Scheint ein fehler zu sein, genau weiß ich aber nicht wieso das so ist. Denn alle anderen Jahre, davor und danach ist das nicht so.

Vieleicht hilft es dir aber, den durch deinen Code blick ich nicht so recht durch.

 
MelloPie
29-12-2008, 08:55 
 
warum verwendest Du nicht einfach die Funktion strtotime()?
zB:

//Montag:
echo date('w')==1 ? date('d-m-Y'):date('d-m-Y',strtotime("Last Monday"));
// Sonntag:
echo date('d-m-Y',strtotime("Sunday"));

 
MelloPie
29-12-2008, 09:09 
 
Original geschrieben von Edlly
also ich weiß das bei mir date diese jahr (2008) statt 53, 01 bei der KW ausgibt. Scheint ein fehler zu sein, genau weiß ich aber nicht wieso das so ist. Denn alle anderen Jahre, davor und danach ist das nicht so.


Schon mal in einen Kalender geschaut? Es gibt 2008 nur 52 Wochen.

 
Edlly
29-12-2008, 12:52 
 
also alle meine kalender haben 53... entwerder habe ich nur fehldrucke oder du irrst dich..

 
lennart
29-12-2008, 13:09 
 
Wir befinden uns jetzt schon in KW 01/09

 
MelloPie
29-12-2008, 13:14 
 
Original geschrieben von Edlly
also alle meine kalender haben 53... entwerder habe ich nur fehldrucke oder du irrst dich..

Fehldrucke

 
Edlly
29-12-2008, 15:06 
 
Original geschrieben von lennart
Wir befinden uns jetzt schon in KW 01/09

Das könnte es natürlich erklären!

Wobei ich leider auch keine regel finde nach der das festgelegt ist, scheint irgenwie auslegungs sache zu sein ob das 01. oder 53. ist? Ist eigentlich auch egal.

 
onemorenerd
29-12-2008, 15:19 
 
date('w') richtet sich nach ISO 8601, welches als erste Woche im Jahr die Woche mit dem ersten Januar-Donnerstag definiert. Die anderen Zeitfunktionen in PHP richten sich diesbezüglich hoffentlich auch nach diesem Standard, wobei mir gerade gar keine Funktion einfällt, mit der man sonst noch die Wochennummer bestimmen kann.

 
MelloPie
29-12-2008, 15:47 
 
Die Regel ist einfach, es gibt sogar eine DIN nrm dazu:
die erste Woche des Jahres ist Woche, in die mindestens vier Tage des neuen Jahres fallen (DIN 1355 / ISO 8601)

 
fireweasel
30-12-2008, 12:24 
 
Die Kalenderwochenzählung nach ISO-8601 (http://de.wikipedia.org/wiki/ISO_8601) wird in der Wikipedia (http://de.wikipedia.org/wiki/Woche#Kalenderwoche) erschöpfend erklärt, ist aber nicht die einzige Zählweise:

http://de.wikipedia.org/wiki/Woche#Berechnung_in_den_USA_und_vielen_anderen_L.C3.A4ndern

http://de.wikipedia.org/wiki/Woche#Weitere_Berechnungsvarianten

 
Koala
30-12-2008, 15:25 
 
http://www.nwn.de/hgm/kalender/kal-64.htm:

Prinzipiell könnte man die zugehörige Kalenderwoche zu
einem Datum berechnen, indem man ermittelt um welchen Tag des
Jahres es sich handelt und diesen dann durch sieben teilt. Eine
Kalenderwoche beginnt aber laut der DIN 1355 - Zeit immer
Montags, so dass hierzu zunächst bestimmt werden muss, wann
die erste Woche des Jahres beginnt.

function Kalenderwoche(tag,monat,jahr) {
var Woche = 0;
var Wchtag1Jan = CurrentDoomDay(jahr);
var Tage = Tag_des_Jahres(tag,monat,jahr)-1;

if (Wchtag1Jan > 3)
Tage = Tage - (7 - Wchtag1Jan);
else Tage = Tage + Wchtag1Jan;

if (Tage < 0)
if ( (Wchtag1Jan == 4)
|| (CurrentDoomDay(jahr-1) == 3))
Woche = 53;
else Woche = 52;
else Woche = Math.floor(Tage/7) + 1;

if ((Tage > 360) && (Woche > 52)) {
if (Wchtag1Jan == 3)
Woche = 53;
else if (CurrentDoomDay(jahr+1) == 4)
Woche = 53;
else Woche = 1;
}

return Woche;
}

Dieser Algorithmus berechnet zunächst den Jahrestag des
Datums, und dann wird die Tagesanzahl so korrigiert, dass
beginnend vom ersten Montag des Jahres gerechnet wird. Dies
funktioniert gut für 51 Wochen des Jahres, Probleme bereiten die
ersten und die letzten Tage des Jahres. Sofern eine negative
Tageszahl ermittelt wurde, liegen die ersten Tage eines Jahres in
der letzten Woche des Vorjahres. Dabei muss berücksichtigt
werden, dass ein Jahr eine 53. Woche hat, wenn es mit einem
Donnerstag beginnt oder endet. Genauso muss für die letzten
Tages des Jahres bestimmt werden, ob sie in der letzten Woche
des aktuellen Jahres liegt, oder aber bereits in der ersten Woche
des Folgejahres.


Alle Zeitangaben in WEZ +2. Es ist jetzt 04:14 Uhr.