L learn Medlem sedan jan. 2005 1 130 inlägg Trådstart 20 mars 2005 12:37 #1 Jag har stött på ett problem med veckonummerhanteringen i mitt kalenderscript. Man ska kunna hoppa mellan olika veckor. Problemet är att antalet veckor ett år kan variera mellan 52 och 53.
Susning skrev:
Veckorna numreras från början av året, men reglerna skiljer sig lite åt i olika länder för hur veckorna skall numreras. I Sverige blir den första veckan av vilken minst 4 dagar hamnar inom det nya året vecka 1. Sista veckan kan bli nummer 52 eller 53. Sverige följer med andra ord gällande ISO-standard för veckonummer, ISO 8601:1988.
Hur skall jag ta reda på hur många veckor det finns ett givet år??
J jOOOL Medlem sedan sep. 2004 36 inlägg http://se.php.net/manual/en/function.date.php
använd date('W') för att få fram vilken vecka det är. Det ska ta fram veckan enligt ISO-8601.
W ISO-8601 week number of year, weeks starting on Monday (added in PHP 4.1.0) Example: 42 (the 42nd week in the year)
L learn Medlem sedan jan. 2005 1 130 inlägg Jojo, men hur får jag fram ANTALET veckor ett givet år?
Peeer Medlem sedan mars 2002 5 907 inlägg <?php
echo date('W',strtotime(date('Y'). '-12-31'));
?>
Har dock för mig att jag sett en smidigare lösning någonstans.
L learn Medlem sedan jan. 2005 1 130 inlägg ok, tackar! ska testa mig fram lite
dectgap Medlem sedan sep. 2002 1 655 inlägg
Peeer skrev:
<?php
echo date('W',strtotime(date('Y'). '-12-31'));
?>
Har dock för mig att jag sett en smidigare lösning någonstans.
Fast det är möjligt att den sista december tillhör vecka 1 på efterföljande år.
Här är en JavaScript-lösning:
http://www.webforum.nu/showthread.php?s=&forumid=24&threadid=120516
Omskrivet till PHP:
function weeksInYear($yearNum) {
$firstDay = mktime(0,0,0,1,1,$yearNum); // 1 januari
$lastDay = mktime(0,0,0,11,31,$yearNum); // 31 december
$firstDayWeekDay = date('w', $firstDay); // Veckodag, där 0=sön, 1=mån, 2=tis, o.s.v.
$lastDayWeekDay = date('w', $lastDay);
return ($firstDayWeekDay == 4 || $lastDayWeekDay == 4) ? 53 : 52;
}
L learn Medlem sedan jan. 2005 1 130 inlägg tack för engagemanget men det funkar inte som det ska. Enligt funktionen så har år 2005 53 veckor... stämmer inte, ska vara 52..
fiddler Medlem sedan juli 2002 3 617 inlägg Nyfiken som man är: Vad ska du ha funktionen till?
red/ Tar tillbaka frågan, läste lite nogrannare i ditt första inlägg...
L learn Medlem sedan jan. 2005 1 130 inlägg Läs inledningen till tråden. För att kunna hoppa mellan december och januari så måste jag veta hur många veckor det gångna året innehåller... om du förstår...
dectgap Medlem sedan sep. 2002 1 655 inlägg Det blev något fel vid översättningen från JavaScript till PHP, för enligt JavaScript-funktionen har år 2005 endast 52 veckor.
Och nu hittade jag felet.
Rätt ska vara:
function weeksInYear($yearNum) {
$firstDay = mktime(0,0,0,1,1,$yearNum); // 1 januari
$lastDay = mktime(0,0,0,12,31,$yearNum); // 31 december
$firstDayWeekDay = date('w', $firstDay); // Veckodag, där 0=sön, 1=mån, 2=tis, o.s.v.
$lastDayWeekDay = date('w', $lastDay);
return ($firstDayWeekDay == 4 || $lastDayWeekDay == 4) ? 53 : 52;
}
Felet låg på andra raden inuti funktionen.