Avatar billede Lucky_Mik Nybegynder
26. august 2010 - 09:33 Der er 9 kommentarer og
1 løsning

liste med ALLE uger i et år

Hej

Jeg vil gerne lave en liste med alle uger på et bestemt år.
Antal uger findes med:
$t = mktime(12,0,0,12,31,$aar);
$antal_uger = date("W",$t);
if ($antal_uger==1) $antal_uger=52;

Men i nogle år tilhører de første dage i året uge53(fra sidste år), men disse dage hører faktisk til på kalenderen over året jeg ønsker at se.
I 2010 er 1/2/3 januar i uge53.
Så for 2010 bliver ugelisten :
53, 1,2...., 52

Hvordan laver jeg sådan noget ? Jeg har kikket her på eksperten, men kan ikke finde noget, der kan bringe mig videre, derfor spørgsmål.

Venlig hilsen Kim
Avatar billede repox Seniormester
26. august 2010 - 11:24 #1
<?php

    $year = 2010;
    $start = mktime(0, 0, 0, 1, 1, $year);   
    $end = mktime(0, 0, 0, 12, 31, $year);
   
    if( date("W", $start) > 1 )
        $weeks[] =  date("W", $start);
       
    for($i = 1; $i <= date("W", $end); $i++)
        $weeks[] = $i;
   
    echo implode(", ", $weeks);

?>
Avatar billede Lucky_Mik Nybegynder
26. august 2010 - 12:32 #2
Det ser meget fint ud, men for 2013 giver det første uge som 53 og http://www.timeanddate.com/calendar/?year=2013&country=2 mener det er uge 1 ?
Avatar billede repox Seniormester
26. august 2010 - 12:45 #3
Sådan her, så:
<?php

    $year = 2013;
    $start = mktime(0, 0, 0, 1, 1, $year);   
    $end = mktime(0, 0, 0, 12, 31, $year);
    $sprint = 60 * 60 * 24 * 7;
       
    for( $i = $start; $i <= $end; $i = ($i + $sprint) )
        $weeks[] = (int)date("W", $i);
   
    echo implode(", ", $weeks);

?>
Avatar billede Lucky_Mik Nybegynder
26. august 2010 - 17:08 #4
Ingen af løsningerne giver korrekt resultat, når man sammenligner med http://www.timeanddate.com/calendar/?year=2013&country=2
Avatar billede Lucky_Mik Nybegynder
26. august 2010 - 17:11 #5
I 2013 hører d. 30 og 31 december i øvrigt til uge 1 i år 2014...
Avatar billede repox Seniormester
26. august 2010 - 18:09 #6
Så vidt jeg kan se, med mit sidste forslag stemmer det fint overens med det link du selv sammenligner med - første uge i 2013 er uge 1, sidste uge er også uge 1.
Samme gør sig gældende for år 2014.
Avatar billede Lucky_Mik Nybegynder
26. august 2010 - 21:19 #7
Dit andet forslag er næsten rigtigt, men 31/12 2012 tilhører uge 1, og uge 1 kommer ikke med i listen. Det er noget med de 7 dage du ligger til, den holder ikke m.h.t. den sidste uge ?
Avatar billede Lucky_Mik Nybegynder
26. august 2010 - 21:44 #8
Jeg har lige prøvet med

    $year = 2012;
    $start = mktime(0, 0, 0, 1, 1, $year);
    $end = mktime(0, 0, 0, 12, 31, $year);
    $sprint = 60 * 60 * 24 * 7;
    if(count($weeks) > 50) {$sprint = 60 * 60 * 24; }
    for( $i = $start; $i <= $end; $i = ($i + $sprint) )
        if((int)date("W", $i) != count($weeks)) {
            $weeks[] = (int)date("W", $i);
        }
        echo implode(", ", $weeks);

hvor jeg efter uge 50 kun går en dag frem ad gangen, men det virker stadig ikke for 2012.
Avatar billede Lucky_Mik Nybegynder
26. august 2010 - 22:52 #9
Så fungerer den fra 2010 til 2020 mindst:

$year = 2012;
$start = mktime(0, 0, 0, 1, 1, $year);
$end = mktime(0, 0, 0, 12, 31, $year);
$sprint = 60 * 60 * 24 * 7;

for( $i = $start; $i <= $end; $i = ($i + $sprint) ) {
    $weeks[] = (int)date("W", $i);
    if(end($weeks) == prev($weeks)) {
        array_pop($weeks);
    }
    $antal_i_alt = count($weeks);
    if($antal_i_alt > 50) {
    $sprint = 60 * 60 *24;
    }
}
echo implode(", ", $weeks);

Det kan sikkert gøres smartere, men det fungerer fint.
Repox, uden dig var det ikke gået, læg et svar, så får du point. Og tak for din hjælp.
Avatar billede repox Seniormester
27. august 2010 - 07:55 #10
Efter at have undersøgt det lidt nærmere, finder jeg ud af at grunden til at mit andet kodeeksempel ikke virker korrekt er grundet en dokumenteret bug (som kan forefindes her: http://bugs.php.net/33957 ) som påvirker en række forskellige årstal.

Det kan være det er fikset i den næste stable, men det er godt hvis du har fundet et workaround indtil da.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester