PHP 5.2: de Date extensie uitbreidingen
Een van de nieuwe dingen in PHP 5.2 is de uitgebreidde Date extensie. Dat is een beetje een understatement want naar verluidt is de extensie grotendeels herschreven. Het was de bedoeling dat de uitbreiding in de Date extensie al eerder beschikbaar werd maar doordat de PEAR Date klasse ook de klassenaam Date gebruikte en de nodige druk van een nieuwe release is toen besloten om deze klassen later toe te voegen.
Zodoende is een deel van de nieuwe functionaliteit al in PHP 5.1 te vinden terwijl de rest pas echt vanaf 5.2 beschikbaar is. Dit artikel introduceert de belangrijkste wijzigingen.
Update: Een comment op Evert's blog beschrijft hoe je een DateTime klasse kunt configureren met een unix timestamp. Ik heb dat ook toegevoegd aan het overzicht.
Update II: In PHP 5.3 is deze functionaliteit nog verder uitgebreidt met o.a. een DateInterval en DatePeriod klasse. Lees verder in PHP 5.3: Date extensie revisited.
De datum functies die je gewend bent, zoals date() en strtotime(), blijven gewoon bestaan en blijven op dezelfde manier werken. De date extensie is namelijk voornamelijk achter de schermen verbeterd. Zo is de implementatie van strtotime() veel robuuster geworden, heeft de ontwikkelaar meer controle gekregen over tijdzones en werken de datum functies intern met een 64-bit integer in plaats van een 32-bit integer waardoor ze voorlopig weer toekomst-proof zijn.
De juiste datum bepalen
Een van de grotere veranderingen is de manier waarop PHP bepaalt wat de tijd is. Om de tijd juist te bepalen heb je namelijk een tijdzone nodig. Om deze tijdzone te bepalen praatte PHP voor versie 5.1 altijd met het operating system.
Om de programmeur daar wat meer vat op te laten krijgen zal PHP vanaf versie 5.1 proberen om de tijdzone te bepalen door de volgende stappen te ondernemen:
- Controleer of er een tijdzone gezet is met date_default_timezone_set()
- Controleer of er een tijdzone gezet is in de omgevingsvariabel TZ
- Controleer of er een tijdzone gezet is in de date.timezone php.ini configuratie optie
- Probeer via het operating system te achterhalen wat de tijdzone is
- Als geen van deze stappen gelukt is wordt de tijdzone UTC gebruikt
Belangrijk: De stappen werken van boven naar beneden. Op het moment dat er in een van de stappen een geldige waarde wordt gevonden, wordt die waarde gebruikt en de rest van de stappen worden niet meer uitgevoerd. Bestaat er dus een TZ omgevingsvariabele dan zal de date.timezone configuratie optie genegeerd worden.
Datums weergeven
PHP 5.2 brengt 2 nieuwe klassen met zich mee waarmee je met datums kunt werken: DateTime en DateTimeZone. De DateTime klasse implementeert een combinatie van de functionaliteit van de functies time(), strtotime() en date():
-
/* Geef de datum van vandaag weer: */
-
$date = new DateTime();
-
-
/* Geef een absolute datum uit het verleden weer: */
-
$date = new DateTime("2nd July 1999");
-
-
/* Geef een datum weer vanaf een Unix timestamp. Dit doe je met een @ voor de timestamp: */
-
$date = new DateTime("@1192951100");
-
-
/* Geef de datum van volgende week weer: */
-
$date = new DateTime("next week");
-
-
/* Geef een relatieve datum uit het verleden weer: */
-
$date = new DateTime("3 years ago");
Je kunt de DateTime constructor op 3 manieren een datum geven:
- Je geeft geen argument aan de constructor door: je krijgt dan een DateTime object voor nu
- Je geeft een absolute datum door zoals bijvoorbeeld "2 July 1999"
- Je geeft een relatieve datum door zoals bijvoorbeeld "2 weeks ago" om de datum van 2 weken geleden te krijgen.
Om een indruk te krijgen van de formaten die de DateTime constructor ondersteunt kun je kijken naar het GNU Date Input Format document. Het blijkt echter dat er nog meer formaten ondersteund worden, maar deze zijn helaas nog niet gedocumenteerd.
De extensie biedt ook enkele constantes welke standaard datum formaten definieren:
-
$date = new DateTime("2 years ago");
-
Hieronder staan enkele interessante constantes:
- DATE_RSS - Datum voor gebruik in RSS feeds
- DATE_ATOM - Datum voor gebruik in Atom feeds
- DATE_COOKIE - Datum voor gebruik in HTTP cookies
- DATE_RFC822 - Datum voor gebruik in email headers
Het volledige overzicht van de constantes is staat in de officieel beschikbare documentatie.
DateTime heeft ook nog een methode waarmee je de datum verder kunt wijzigen na de instantiatie. DateTime::modify() accepteert hetzelfde soort argument als de constructor en past deze (als het een relatieve datum string is) toe vanaf de datum die in de constructor gegenereerd werd. De volgende code geeft daarom dus een datum van over 2 weken:
-
$dateObj = new DateTime("next week");
-
$dateObj->modify("next week");
-
Met datums werken
Als je nu juist toegang wilt tot de individuele elementen van de datum zoals de dag, maand, jaar, enzovoorts kun je daarvoor de functie date_parse() gebruiken. Deze functie is een soort combinatie tussen getdate() en strtotime(). Als argument accepteert date_parse() een string net zoals de DateTime constructor en strtotime() en retourneert vervolgens een array van de elementen:
-
$date = date_parse("2nd june 2006");
-
Hoewel de date_parse() functie ook relatieve datum strings accepteert (zoals "next week") werkt dat niet helemaal zoals ik verwacht had. In plaats van dat je de berekende datum kunt benaderen zoals hierboven krijg je in het resultaat een element 'relative' dat per tijdseenheid aangeeft hoeveel eenheden worden erbij geteld of er afgehaald zouden worden:
-
$date = date_parse ("next week");
-
-
-
/*
-
array(6) {
-
["year"]=>
-
int(0)
-
["month"]=>
-
int(0)
-
["day"]=>
-
int(7)
-
["hour"]=>
-
int(0)
-
["minute"]=>
-
int(0)
-
["second"]=>
-
int(0)
-
}
-
*/
Tijdzones
Om de programmeur meer controle te geven over het gebruik van tijdzones zijn er enkele functies en een aparte klasse toegevoegd. Zo kunnen we bijvoorbeeld relatief simpel achterhalen of onze eigen Tri al zo'n beetje wakker zou moeten zijn door middel van de volgende code:
Met DateTime::setTimezone() kunnen we dus zelfs nadat we een datum hebben bepaald een tijdzone toekennen aan een DateTime instantie. Wanneer de datum wordt weergegeven wordt de gewijzigde tijdzone automatisch toegepast.
Mocht Tri nu een beetje heimwee hebben en graag zijn PHP scripts met de Nederlandse tijd laten werken, dan kan hij dat doen via de functie date_timezone_default_set():
-
/* Uncomment de volgende regel om dit voorbeeld in Nederland naar behoren te laten werken */
-
// date_default_timezone_set('America/Los_Angeles');
-
-
$tijdNu = new DateTime();
-
-
date_default_timezone_set('Europe/Amsterdam');
-
-
$tijdNu = new DateTime();
Maar zoals je zag in de stappen die PHP onderneemt om de tijdzone te bepalen wanneer je script begint zou je ook bijvoorbeeld de date.timezone configuratie optie kunnen wijzigen in .htaccess.
Handig: De functie date_default_timezone_set() en ook de configuratie optie date.timezone zijn ook al beschikbaar in versies vanaf PHP 5.1.3. De twee klassen DateTime en DateTimeZone zijn echter echt nieuw in PHP 5.2.
Conclusie
De uitbreidingen in de Date extensie maken het werken met datums en zeker met tijdzones simpeler en duidelijker.
Volg Scriptorama via RSS!
Reageer ook!
Een andere manier voor DATE_RSS is de r bij date()
Wel mooi die Timezone opties, nog leuker is dat ik zo iets een paar maande geleden zelf heb gemaakt en het nu dus gewoon standaart gaan onderstuinen...Grrr
Door Sebastiaan Stok
op 09.02.06 @ 4:52 pm | Permalink
Verrekte handig deze nieuwe features :)
Door Tri Pham
op 09.03.06 @ 8:07 am | Permalink
Goeie introductie, thanks Mathieu :)
Door Michel
op 09.03.06 @ 1:03 pm | Permalink
Beter deze extensie, maare de oude date functie werkte ook goed.
Door Iwan Luyks
op 09.04.06 @ 2:08 pm | Permalink
Pakt PDO nu ook een DateTime op? Dat zou mooi zijn!
Door Ard
op 11.06.06 @ 2:14 pm | Permalink
[...] Uiteindelijk is de Date klasse er in PHP 5.1.1 tijdelijk uit PHP gehaald en later in PHP 5.2 weer toegevoegd met de naam DateTime. Over deze klasse hebben we op Scriptorama ook al het nodige geschreven: de DateTime klass in PHP 5.2. [...]
Door Scriptorama.nl » Namespaces in PHP-6 en PHP-5.3 op 09.30.07 @ 10:36 am | Permalink
[...] vast wel weet heeft PHP 5.2 de nodige nieuwe goodies. In een vorig artikel beschreef ik al de nieuwe datum- en tijds functies die met PHP 5.2 worden meegeleverd en vandaag kijken we eens naar de filter extensie die ook sinds PHP 5.2 wordt [...]
Door Scriptorama.nl » PHP5: Een formulier verwerken met de filter extensie op 03.16.08 @ 1:48 pm | Permalink
Weet iemand of hier ook officiele documentatie voor beschikbaar is? Ik zoek namelijk een manier om na het modifyen van een tijd met DateTime weer terug te gaan naar een UNIX timestamp.
Is hier ook een method voor?
Door Alex
op 05.14.08 @ 10:19 pm | Permalink
Hoi Alex,
De documentatie staat tussen de gewone date functies. Niet heel handig, I know.
Om jouw probleem op te lossen gebruik je (bijvoorbeeld):
Door Mathieu Kooiman
op 05.15.08 @ 6:22 am | Permalink
Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>