[php] datum uit weeknummer

Pagina: 1
Acties:
  • 165 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig een functie te maken die een week kalender toont aan de hand van een datum. Hoe ik dit wilde doen is het volgende:
- Bepaal het weeknummer uit een datum/timestamp (voor nu is dit time() )
- Bepaal welke dagen er in de week vallen
- Maak er een leuk tabelletje omheen
- Return tabel

Klinkt leuk maar ik krijg het bepalen welke dagen er in een week zitten niet voor elkaar...

PHP:
1
2
3
$weeknum = date( "W", time() );
$test = mktime(0,0,0,1,$weeknum*7,2003);
$date = date( "d-m-Y" , $test );


$weeknum = 41; // is deze week dus
$date = 14-10-2003 // een week te ver dus?!

mijn idee was om het weeknummer * 7 te doen, dit is dan het dagnummer van dit jaar. (correct?)
mktime "overflowed" de te veel dagen door naar de volgende maand, dus ik begin bij januari en dan zou hij dus door moeten gaan tot hij bij de juiste datum is.

Wat is er mis aan mijn plan? Ik zie vast iets over het hoofd dat het niet goed uitkomt...

Acties:
  • 0 Henk 'm!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

$weeknum * 7 is niet het dagnummer, omdat het jaar op elke dag kan beginnen. Als ik jou was zou ik (weeknum - 1) * 7 pakken en dan oplopende data doorlopen tot je er zeven hebt die het goede weeknummer hebben.

Rustacean


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
PHP:
1
2
$test = mktime(0,0,0,1,(($weeknum-1)*7),2003);
$date2 = date( "d-m-Y" , $test );

geeft 07-10-2003, dat is vandaag een dinsdag dus :(

grr ik snap er geen snars van :+

Acties:
  • 0 Henk 'm!

  • xces
  • Registratie: Juli 2001
  • Laatst online: 08-09 17:20

xces

To got or not to got..

Met alle respect voor je probeersel.. Heb je al geprobeerd om open source calenders te downloaden? Er zijn er 10 tallen in PHP met allemaal hun eigen manier van calender opbouwen. Dit scheelt je ook een hoop gecode.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
PHP:
1
2
function week_to_time($week, $year, $day = 0){ 
        return mktime(0, 0, 0, 1, 4 - date('w', (mktime(0, 0, 0, 1, 4, $year) - 1)) + $day, $year) + 604800 * ($week - 1);

zojuist gevonden en deze werkt.
maar ik wil graag weten waarom het werkt, zodat ik er wat van leer.

beetje jatten kan iedereen, ik wil er ook van leren!

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Is het niet veel handiger om gewoon de dag te achterhalen waar je op bezig bent en dan de rest van de dagen eromheen te tonen ?

Acties:
  • 0 Henk 'm!

Verwijderd

waarom het werkt??

wat snap je er niet aan? kun je een iets duidelijkere vraag stellen?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoe de functie is opgebouwd snap ik niet:
PHP:
1
2
3
4
return mktime(0, 0, 0, 1, 4 -  // hier doen we iets met 4 januari
date('w', (mktime(0, 0, 0, 1, 4, $year) - 1)) + $day,  //het dagnummer -1 van 4 januari ?
$year)  // het jaar dat bij de eerste 4 januari hoort
+ 604800 * ($week - 1);  // 604800 = 7 dagen * weeknummer-1

en dit returned de timestamp van de maandag van de gesubmitte week.
maar hoe dit tot stand komt is echt niet logisch voor mij...

Acties:
  • 0 Henk 'm!

  • bakkerl
  • Registratie: Augustus 2001
  • Laatst online: 01-09 19:17

bakkerl

Let there be light.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?
$DayOfWeek = date("w", time());  // bepaal welke dag het in de week is (0=zondag).
$DayOfWeek--;  // Omdat we bij maandag willen beginnen.
                                                                                                               
echo "<br>Maandag van de week:";
echo "<br>" . date("d-m-Y", (time()+(($DayOfWeek*-1)*86400)));
                                                                                                               
echo "<br>Data deze week:";
for ($i=(0-$DayOfWeek); $i<(6-$DayOfWeek); $i++)
{
  // Aantal sec in dag = 60*60*24 = 86400
  echo "<br>".date("d-m-Y", (time()+($i*86400)));
}
                                                                                                               
?>

Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 01-08 12:04

WormLord

Devver

Hier is een functie die ik gebruik om een datum van jaar-week-dag om te zetten naar jaar-maand-dag:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
      function ywd2ymd($year, $week, $day)
      {
         // converts date in ywd format to dmy format
         // input:   $year, $week, $day = integer
         // returns: (year, month, day) = array

         $monthday = $day + (7 * ($week - 1)) + 1 - dayofweek(mktime(0, 0, 0, 1, 1, $year));
         $date = mktime (0, 0, 0, 1, $monthday, $year);
         $year = intval(date("Y", $date));
         $month = intval(date("m", $date));
         $day = intval(date("d", $date));

         return array($year, $month, $day);
      }

En ja, ik weet nu dat het beter kan, maar het werkt wel.

Acties:
  • 0 Henk 'm!

Verwijderd

De volgende code werkt om van weeknummer de eerste dag van die week op te halen.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  function weektoday($week,$year)
  {
    // pre: $year is een geldig jaar.
    //      als year een ongeldig jaar is dan wordt het hudig jaar genomen.
    
    // year ligt in het geldig bereik van Windows. Windows kan geen andere jaren aan.
    
    if (($year <= 1970) || ($year >= 2039))
    { $year = date("Y");
    }

    $day = strtotime($year."-01-01");
    $dayofweek = date("w",$day);
    if ($dayofweek != 5 && $dayofweek != 6 && $dayofweek != 0)
    {
      while(1 != date("w",$day))
      { $day = mktime(0,0,0,date("m", $day),date("d", $day)-1,date("Y", $day));
      }
    }
    else
    { while (1 != date("w",$day))
      { $day = mktime(0,0,0,date("m", $day),date("d", $day)+1,date("Y", $day));
      }
    }
    
    $day = mktime(0,0,0,date("m", $day),date("d", $day)+7*$week-7,date("Y", $day));
    
    return $day;
  }



Auteursrechten voorbehouden.
Pagina: 1