[PHP] week nummer converteren naar een datum?

Pagina: 1
Acties:
  • 128 views sinds 30-01-2008

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Een hele vreemde simpele vraag misschien, maar ik kan het antwoord nergens vinden:

Hoe kan ik een week nummer converteren naar een datum (of seconden vanaf 1970) in PHP?

Er staan zat voorbeelden online om een datum te converteren naar week nummer maar niet anders om.

Acties:
  • 0 Henk 'm!

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 21-09 12:54
Je zult terug moeten gaan rekenen naar het aantal dagen. Van het aantal dagen zou je terug moeten vinden de maand en dag in de mand. Die gegevens kun je weer in mktime() duwen om een unixtimestamp te genereren. Tenminste dit is een oplossing die me zo snel te binnen schiet.

Acties:
  • 0 Henk 'm!

Verwijderd


Acties:
  • 0 Henk 'm!

  • Obliterator
  • Registratie: November 2000
  • Laatst online: 19-09 14:48
Denk er dan ook even aan dat er verschillende definities zijn voor het weeknummer... Week 1 kan zijn de week waar 1 januari in valt, eerste volle week van het jaar, eerste week met 4 dagen.

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:34
Als we uitgaan van de Europese standaard* dan doet onderstaande functie het voor je:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
 * Weektotimestamp returns a unix timestamp based on a year, week number and day of the week (monday being 1, sunday 
 * being 7)
 * Input:   INT year
 *          INT week
 *          INT day
*/
function weektotimestamp($year, $week, $day)
{

    $firstdate = mktime (0,0,0,01,4, $year); // jan 04 always in week 1
    $firstday = date("w", $firstdate); // fetch day of week of jan 04
    if ($firstday == 0) { $firstday = 7; }
    $offset = ($week-1) * 7 - $firstday + $day; //calc number of days difference from jan 04
    
    return strtotime('+' .$offset .' days', $firstdate);
}


* Dat is dan de eerste week waarvan minstens 4 dagen in het nieuwe jaar vallen, met een week beginnend op maandag :)

[ Voor 15% gewijzigd door T-MOB op 21-11-2005 16:01 ]

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Je hebt ook een dag en jaar nodig om iets met het weeknummer te kunnen.

Je kunt het ook met mbv de MySQL calendar doen;
SQL:
1
2
mysql> select str_to_date('200442 Monday', '%X%V %W');
-> 2004-10-18

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
T-MOB schreef op maandag 21 november 2005 @ 15:57:
Als we uitgaan van de Europese standaard* dan doet onderstaande functie het voor je:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
 * Weektotimestamp returns a unix timestamp based on a year, week number and day of the week (monday being 1, sunday 
 * being 7)
 * Input:   INT year
 *          INT week
 *          INT day
*/
function weektotimestamp($year, $week, $day)
{

    $firstdate = mktime (0,0,0,01,4, $year); // jan 04 always in week 1
    $firstday = date("w", $firstdate); // fetch day of week of jan 04
    if ($firstday == 0) { $firstday = 7; }
    $offset = ($week-1) * 7 - $firstday + $day; //calc number of days difference from jan 04
    
    return strtotime('+' .$offset .' days', $firstdate);
}


* Dat is dan de eerste week waarvan minstens 4 dagen in het nieuwe jaar vallen, met een week beginnend op maandag :)
Wow, dank je, dat werkt perfect, alleen denk ik dat zondag niet 7 is maar 0, anders krijg je nogal vreemde resultaten ;) In ieder geval werkt het perfect!

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Dit is al heel vaak voorbij gekomen, kijk hier maar eens wat er gebeurt als ik je topictitel bijna letterlijk in de search invoer: [search=php weeknummer converteren naar datum]. :)

Volgende keer dus eerst even zoeken voor je een topic opent. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1

Dit topic is gesloten.