Avatar billede FitnessDukken Nybegynder
21. juni 2009 - 14:33 Der er 3 kommentarer

Tid & dato - Kalender

Hej.

Jeg er igang med at lave en kalender som skal vise en uge af gangen. Jeg har fundet frem til følgende løsning.

<?php
// dato og tid lige nu!
if(!isset($_GET["week"])) {
$dato = date("Y/m/d");
$day = date("d");
$month = date("m");
$year = date("Y");
}

// sidste uge i det foregående år
    // tjek om det foregående år et et skudår
    $last_year = $year - 1;
   
    if(($last_year) % 4 == "0" || ($last_year - 1) % 400 == "0") {
        $skudaar = "true";
    } else {
        $skudaar = "false";
    }

    if($skudaar == "true") {
       
        $isDay = date("D", mktime(0,0,0,12,26,$last_year));
        if($isDay == "Sat" || $isDay == "Sun") {
            $last_week_last_year = 53;
        } else {
            $last_week_last_year = 52;
        }
    }
   
    if($skudaar == "false") {
        $isDay = date("D", mktime(0,0,0,12,27,$last_year));
       
        if($isDay == "Sun") {
            $last_week_last_year = 53;
        } else {
            $last_week_last_year = 52;
        }
    }
   
    // sidste uge dette år
    if(($year) % 4 == "0" || ($year - 1) % 400 == "0") {
        $skudaar = "true";
    } else {
        $skudaar = "false";
    }

    if($skudaar == "true") {
       
        $isDay = date("D", mktime(0,0,0,12,26,$year));
        if($isDay == "Sat" || $isDay == "Sun") {
            $last_week_this_year = 53;
        } else {
            $last_week_this_year = 52;
        }
    }
   
    if($skudaar == "false") {
        $isDay = date("D", mktime(0,0,0,12,27,$year));
       
        if($isDay == "Sun") {
            $last_week_this_year = 53;
        } else {
            $last_week_this_year = 52;
        }
    }



$this_week = date("W", strtotime($dato));

    function getDaysInWeek ($weekNumber, $year) {
    // Count from '0104' because January 4th is always in week 1
    // (according to ISO 8601).
    $time = strtotime($year . '0104 +' . ($weekNumber - 2) . ' weeks');
    // Get the time of the first day of the week
    $mondayTime = strtotime('-' . (date('w', $time) - 1) . ' days',$time);
    // Get the times of days 0 -> 6
    $dayTimes = array ();
    for ($i = 0; $i < 7; ++$i) {
        $dayTimes[] = strtotime('+' . $i . ' days', $mondayTime);
    }
    // Return timestamps for mon-sun.
    return $dayTimes;
    }


    if($_GET["action"] == "prev") {
        $this_week = $_GET["week"] - 1;
       
        if($this_week < 1) {
            $this_week = $last_week_last_year;
            $year = $year - 1;
        }
    }
   
    if($_GET["action"] == "next") {
        $this_week = $_GET["week"] + 1;
       
        if($this_week > $last_week_this_year) {
            $year = $year + 1;
            $this_week = 1;
        }
    }

// her bliver datoerne vist
    $dayTimes = getDaysInWeek($this_week, $year);
    foreach ($dayTimes as $dayTime) {   
   
    if((strftime('%a', $dayTime)) == "Mon") {
    print "<td>Mandag ";
    }
   
    if((strftime('%a', $dayTime)) == "Tue") {
    print "<td>Tirsdag ";
    }
   
    if((strftime('%a', $dayTime)) == "Wed") {
    print "<td>Onsdag ";
    }
   
    if((strftime('%a', $dayTime)) == "Thu") {
    print "<td>Torsdag ";
    }
   
    if((strftime('%a', $dayTime)) == "Fri") {
    print "<td>Fredag ";
    }
   
    if((strftime('%a', $dayTime)) == "Sat") {
    print "<td>Lørdag ";
    }
   
    if((strftime('%a', $dayTime)) == "Sun") {
    print "<td>Søndag ";
    }
     
    echo ($dag . strftime('%d/%m', $dayTime) . "</td> ");
    }   

    ?>

Mit problem er så at den regner ud at sidste år 2008 havde 53 uger, men der er kun 52 uger i sidste år :) så det giver lidt problemer? Nogen der kan se sig ud af en løsning, for jeg er da ihvertfald gået i stå ;)
Avatar billede majbom Novice
21. juni 2009 - 20:52 #1
ved du i hvilken af dine if-sætninger den sætter

$last_week_this_year = 53;

?
Avatar billede mrgumble Nybegynder
21. juni 2009 - 20:54 #2
For det første vil jeg lige påpege, at du misbruger booleske værdier som her:
    if(($last_year) % 4 == "0" || ($last_year - 1) % 400 == "0") {
        $skudaar = "true";
    } else {
        $skudaar = "false";
    }

True og False er ikke strenge, så du er langt bedre stillet ved at skrive:
$skudaar = True;
eller
$skudaar = False;

Det giver dig også mulighed for at udskrifte:
if($skudaar == "false") {
med
if (!$skudaar) {
eller hvis sand;
if ($skudaa) {

Jeg vil også anbefale dig, at koge dine dage ned til heltal (0-6) så du slipper for typo-fejlene som f.eks.:
$dag = "Sun";
if ($dag == "sun") {
  echo "Det er søndag";
}


Hvorfor dit kode returnerer 53 og ikke 52 er svært at sige. Har du testet på andre årstal? Er problemet isoleret i 2008 eller?
Jeg tjekkede i øvrigt kalenderen for 2008. Da der kun er 3 dage tilbage af ugen, starter ugen allerede som ugenr. 1. Så måske er din kode rigtig nok; bare:
if ($this_week == 53)
  $this_week = 1;
Avatar billede majbom Novice
21. juni 2009 - 21:00 #3
der skulle self stå:

$last_week_last_year = 53;

i min kommentar...
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