L learn Medlem sedan jan. 2005 1 130 inlägg Frågan 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... :r
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.