webForumDet fria alternativet

Räkna ut datumet på första veckodagen på en viss vecka och år

PHP

4 svar · 1 390 visningar · startad av jme

Medlem sedan maj 20012 237 inlägg
Frågan#1

Hej.

Hur räknar man ut datumet på första veckodagen på en viss vecka och ett år?

T ex: år 2009 och vecka 1.

Enligt kalendern så infaller måndagen under vecka 1 redan 29.12.2008!

Medlem sedan apr. 200881 inlägg
#2

Gjorde nyligen en funktion som räknar ut veckonummer på givet datum. Det är inte helt trivialt. Om året t.ex. börjar på en lördag så måste du kolla om föregående år är skottår eller ej. Jämför år 2000 med år 2005, där skiljer det sju dagar på samma veckodag och vecka mellan de två åren.

RED: Ibland läser jag inte i vilken avdelning det är postat i, detta är ju i princip gratis i PHP, ett par loopar på sin höjd så är det klart. Kolla funktionen "Date".

Medlem sedan juni 20006 031 inlägg
#3
<?php 
function getFirstDayOfWeek($year, $week)
{
	$offset = date('w', mktime(0,0,0,1,1, $year));
	$offset = ($offset < 5) ? 1 - $offset : 8 - $offset;
	$monday = mktime(0, 0 , 0, 1, 1 + $offset, $year);
	$date = strtotime('+' . ($week - 1) . ' weeks', $monday);
	return date('Y-m-d', $date);
}

echo getFirstDayOfWeek(2009, 1);
?>
Medlem sedan maj 20012 237 inlägg
#4

Tack för förslagen.

Jag uttryckte mig lite dåligt.

Jag kom på att det räcker inte att enbart veta veckonummret och årtalet då jag även skall göra länkar som för användaren bakåt och framåt en vecka i taget.

Tar jag då datumet 31.12.2008 och har följande värden:

år: 2008
vecka: 1

och går bakåt en vecka så blir det tokfel!

Då blir det 31.12.2007!

Jag måste alltså ta även med månaden. Jag resonerar det så att om det är december (12), 2008 och vecka 1 så lägger jag till ett på året så att det blir 2009. Om jag då går tillbaka en vecka så får jag 29.12.2008.

Pedda: testade din metod med smärre förändringar:


function getFirstDayOfWeek($year, $month, $week)
{
	if($month == 12 && $week == 1)
	{
		$year++;
	}
	$offset = date('w', mktime(0,0,0,1,1, $year));
	$offset = ($offset < 5) ? 1 - $offset : 8 - $offset;
	$monday = mktime(0, 0 , 0, 1, 1 + $offset, $year);
	$date = strtotime('+' . ($week - 1) . ' weeks', $monday);
	return date('Y-m-d', $date);
}

echo getFirstDayOfWeek(2008, 12, 1); // 2008-12-29 och som är rätt!
Medlem sedan juni 20006 031 inlägg
#5

I länkarna är det väl enklast att du skickar med datumet, och för föregående drar du bort sju dagar och länken till nästa vecka så lägger du till sju dagar till datumet bara.
Måste ju vara det enklaste.

261 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)