PHP 5.3: Date extensie revisited
Toen PHP 5.2 uit kwam, was daar ook de door Derick Rethans uitgebreidde date extensie. Deze bood al de nodige verbeteringen over de tot dan toe beschikbare datum/tijd functionaliteit in PHP, maar in PHP 5.3 gaat het nog een stapje verder.
In dit artikel bekijk ik het belangrijkste deel van de nieuwe en verbeterde functionaliteit van de datum/tijd functionaliteit zoals deze in PHP 5.3 zal verschijnen.
Uitbreidingen op de DateTime class
De DateTime class heeft behoorlijk wat nieuwe methodes gekregen sinds PHP 5.2.5:
- Lees niet-standaard datums met DateTime::createFromFormat()
- Het is goed mogelijk dat je een keer in de situatie komt dat je datums in een niet-standaard formaat moet uitlezen. Hiervoor kun je DateTime::createFromFormat() gebruiken:
PHP:
-
$string = "jan 18, 2008 om 4am";
-
$date = DateTime::createFromFormat('M d, Y \o\m Ha', $string);
Het formaat geef je op met dezelfde karakters als die je zou gebruiken voor DateTime::format().
-
- Ontdek wat er fout gaat met DateTime::getLastErrors()
- Bij het parsen van zo'n niet-standaard datum formaat kan het ook nog wel eens gebeuren dat het parsen 95x goed gaat, maar 5x niet. Dan wil je wel graag weten dat er iets fout ging en het liefst ook nog wát:
PHP:
-
$string = "jan 2008 om 4am";
-
$date = DateTime::createFromFormat('M d, Y \o\m Ha', $string);
-
-
if ($date === FALSE)
-
{
-
}
Op het moment dat DateTime::createFromFormat() niet gelukt is, zal deze FALSE terug geven. Dat is voor de programmeur reden genoeg om dan met DateTime::getLastErrors() te gaan kijken wat er aan de hand is. Het resultaat van dit voorbeeld is het volgende:
CODE:-
array(4) {
-
["warning_count"]=>
-
int(0)
-
["warnings"]=>
-
array(0) {
-
}
-
["error_count"]=>
-
int(1)
-
["errors"]=>
-
array(1) {
-
[6]=>
-
string(40) "The separation symbol could not be found"
-
}
-
}
Je ziet hierbij dat er 0 warnings waren en 1 error. In het element 'errors' wordt aangegeven vanaf welk karakter het algoritme de te parsen string niet meer kon volgen. In het voorbeeld hierboven is dat dus vanaf karakter #6.
-
- Werken met Unix timestamps
- Het werken met unix timestamps is iets versimpeld. Je kunt nu een UNIX timestamp opgeven met DateTime::setTimestamp() en je kunt de UNIX timestamp van een DateTime object weer verkrijgen middels DateTime::getTimestamp().
PHP:
-
$date = new DateTime();
-
$date->setTimestamp(1215456339);
-
$date->modify("+2 weeks");
-
-
- Wijzig datums met DateInterval, DateTime::add() en DateTime::sub()
- Er was al de methode DateTime::modify() waarmee je een DateTime kon wijzigen, maar nu zijn er ook de expliciete methodes DateTime::add() en DateTime::sub() waarmee je datums kunt wijzigen. De twee methodes accepteren een instantie van DateInterval.
Deze nieuwe klasse stelt een bepaalde periode van tijd voor, bijvoorbeeld een week. Je kunt een instantie van DateInterval maken met DateTime::diff() (zie onder) of bijvoorbeeld met de statische DateInterval::createFromDateString() methode:
PHP:-
$datetime = new DateTime();
-
$interval = DateInterval::createFromDateString('2 weeks');
-
-
$datetime->add($interval);
-
- Vergelijk DateTime objecten met DateTime::diff()
- Met DateTime::diff() wordt het mogelijk om het verschil tussen 2 data te bepalen. Deze functie geeft een DateInterval instantie terug, die je weer kunt weergeven als string, of verder gebruiken in een van de andere methodes die een DateInterval instantie accepteren, zoals bijvoorbeeld DateTime::add() en DateTime::sub().
PHP:
-
$date1 = new DateTime('1 week 7 days ago');
-
$date2 = new DateTime();
-
-
$x = $date1->diff($date2);
-
Typisch is wel dat deze format functie ineens een %-notatie gebruikt, terwijl de andere format functies, zoals bijvoorbeeld DateTime::format() dat niet doen.
-
Uitbreidingen op notatie
De Date extensie die in PHP 5.2 zit kan al behoorlijk wat notaties aan om een datum te genereren:
-
$d = new DateTime("last year");
-
$d = new DateTime("next week");
-
$d = new DateTime("2008-07-18 12:24:24 PDT");
-
$d = new DateTime("10 weeks ago");
In PHP 5.3 zal deze functionaliteit nog verder uit gebreid worden, met o.a:
Belangrijk: Belangrijk om te realiseren is dat de betekenis van notaties als last week, next week, etc. iets gaat veranderen tussen PHP 5.2 en PHP 5.3. In PHP 5.2 betekende last week exact een week, dus 7 dagen, geleden terwijl het in PHP 5.3 zal gaan betekenen: het begin van vorige week.
De betekenis van notaties als last week, next week, +2 weeks zal wat gaan veranderen zodat ze daadwerkelijk wijzen naar het begin van de week, in plaats van simpelweg 7 dagen geleden.
DatePeriod klasse
Nieuw is ook de DatePeriod klasse waarmee je met een DateTime en DateInterval instantie, gemakkelijk kunt itereren over een periode van tijd. Het volgende voorbeeld neemt de datum van nu en voegt daar maximaal 2x 2 dagen, 1 uur en 2 minuten aan toe. Het limiet van 2x is overigens optioneel:
-
$begin = new DateTime();
-
$interval = DateInterval::createFromDateString("2 day 1 hour 2 minutes");
-
-
$x = new DatePeriod($begin, $interval, 2);
-
-
foreach ($x as $y)
-
{
-
}
-
-
// 03-08-2008 09:53 <- "nu".
-
// 05-08-2008 10:55
-
// 07-08-2008 11:57
De DatePeriod klasse voegt vanaf de start datum maximaal 2 iteraties toe aan de datum. Mocht je liever hebben dat de start datum niet wordt meegenomen in de iteraties, dan kun je een vierde argument meegeven aan de DatePeriod constructor:
-
$begin = new DateTime();
-
$interval = DateInterval::createFromDateString("2 day 1 hour 2 minutes");
-
-
$x = new DatePeriod($begin, $interval, 2, DatePeriod::EXCLUDE_START_DATE);
-
-
foreach ($x as $y)
-
{
-
}
Zo heb je echt alleen de 2 iteraties die je hebt opgegeven.
Conclusie
De in mijn ogen toch al behoorlijk degelijke uitbreidingen op de Date extensie die we in PHP 5.2 te zien kregen is in PHP 5.3 nog verder verbeterd en compleet gemaakt.
Volg Scriptorama via RSS!
Reageer ook!
misschien ook eens leuk om naar de andere nieuwe dingen in php 5.3 te kijken: http://phphulp.nl/nieuws/180/
Door Terence`
op 08.04.08 @ 9:23 am | Permalink
@Terence: Daar ben ik, uiteraard, mee bezig ;-)
Door Mathieu Kooiman
op 08.04.08 @ 9:49 am | Permalink
Unixtimestamp was al langer mogelijk ;)
Input: '@timestamp'
Output: 'U'
Door Sebastiaan Stok
op 08.04.08 @ 10:20 am | Permalink
Zie ook het volgende overzicht.
http://www.rooftopsolutions.nl/article/199
Door Marten
op 08.05.08 @ 10:08 am | Permalink
Hms, wat voor reden zou dat nou kunnen hebben? Ik neem aan dat derick zoiets ook wel opgevallen zou zijn. :P
Het is erg lelijk imho.
Door Alfa
op 08.06.08 @ 10:46 pm | 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>