webForumDet fria alternativet

Problem med veckonummer!

PHPur PHP

9 svar · 491 visningar · startad av learn

Medlem sedan jan. 20051 130 inlägg
Frågan#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??

Medlem sedan sep. 200436 inlägg
#2

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)

Medlem sedan jan. 20051 130 inlägg
#3

Jojo, men hur får jag fram ANTALET veckor ett givet år?

Medlem sedan mars 20025 907 inlägg
#4
<?php
echo date('W',strtotime(date('Y'). '-12-31'));
?>

Har dock för mig att jag sett en smidigare lösning någonstans.

Medlem sedan jan. 20051 130 inlägg
#5

ok, tackar! ska testa mig fram lite

Medlem sedan sep. 20021 655 inlägg
#6

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;
}
Medlem sedan jan. 20051 130 inlägg
#7

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..

Medlem sedan juli 20023 617 inlägg
#8

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

Medlem sedan jan. 20051 130 inlägg
#9

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

Medlem sedan sep. 20021 655 inlägg
#10

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.

134 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)