22 april 2007
PHP heeft redelijk uitgebreide mogelijkheden om datums en tijden weer te geven, of juist te rekenen met data. In deze FAQ lopen we een aantal mogelijke toepassingen langs. Het document zal in de toekomst verder uitgebreid worden a.d.h.v. bijvoorbeeld vragen op het forum.
Voor nu worden de volgende vragen behandeld:
Via de date() functie kun je de huidige datum en tijd uitlezen. De functie date() neemt twee parameters aan waarbij alleen de eerste verplicht, namelijk een format string die aangeeft in welk formaat je de datum wilt tonen. Het tweede argument is een epoch timestamp. Als je deze niet hebt gedefinieerd wordt de datum en tijd van het moment van executie genomen. Het eerste argument mag een samenstelling zijn van één of meer van de volgende letters:
| Argument | Bereik | Omschrijving |
| A | AM/PM | Voor de middag of na de middag (Amerikaanse tijdsindeling) |
| a | am/pm | Voor de middag of na de middag (Amerikaanse tijdsindeling) |
| B | Swatch Internet Time | |
| d | 00-31 | Dag van de maand, numeriek |
| F | Naam van de maand, volledig uitgeschreven | |
| G | 0-23 | Uur op een 24-uurs klok, zonder 0 vooraf |
| g | 00-23 | Uur op een 12-uurs klok, zonder 0 vooraf |
| H | 00-23 | Uur op een 24-uurs klok |
| h | 01-12 | Uur op een 12-uurs klok |
| I | 00-59 | Minuten |
| j | 0-31 | Dag van de maand, numeriek, zonder 0 vooraf |
| l | Naam van de weekdag, volledig uitgeschreven | |
| L | 0/1 | Schrikkeljaar of niet |
| M | Naam van de maand, verkort | |
| m | 01-12 | Maand, numeriek |
| n | 01-12 | Maand, numeriek, zonder 0 vooraf |
| O | Huur t.o.v. Greenwich Time | |
| r | RFC822 geformateerde tijd | |
| s | 00-60 | Seconden |
| S | st/th/nd/rd | Engelse suffig van de dag van de maand |
| t | 28/29/30/31 | Aantal dagen in de maand |
| T | Time zone, tekstueel | |
| U | Seconden sinds epoch | |
| w | 0-6 | Dag van de week, numeriek (0 is zondag) |
| W | 01-53 | Weeknummer van het jaar |
| y | 00-99 | Jaar zonder eeuw |
| Y | Jaar met eeuw | |
| z | 00-366 | Dag van het jaar, numeriek |
| Z | Seconden t.o.v. Greenwich Time |
Als je bijvoorbeeld de huidige datum en tijd wilt tonen in een formaat als 22-04-2007 @ 16:04:32 uur dien je de volgende code te gebruiken:
echo date("d-m-Y @ H:i:s");
?>
Via de functie setlocale() kun je aangeven dat je een aantal zaken zoals data en tijden in het Nederlands (of een andere taal) wilt uitlezen. Als je alleen data en tijden in het Nederlands wilt tonen, kun je LC_TIME als eerste argument nemen. Het tweede argument is dan nl_NL:
// Set locale naar Nederlands
setlocale(LC_ALL, 'nl_NL');
// Output: vrijdag 22 december 1978
echo strftime("%A %e %B %Y", mktime(0, 0, 0, 12, 22, 1978));
?>
1 januari 1970 is de ‘starttijd’ van alle processoren van computers en wordt “Unix epoch” genoemd. Doordat dit een harde afspraak is die gemaakt is tussen hardware- en softwarefabrikanten, kan er op deze manier heel makkelijk bepaald worden wat de tijd tussen twee tijden is door beide tijden te converteren naar het aantal seconden sinds epoch. Via de functie mktime() kun je een datum omrekenen naar epoch. De argumenten zijn (in volgorde) uur, minuut, seconde, maand, dag en jaar. Het niet verplicht zevende argument is een 1 als het een datum is die in zomertijd valt, een 0 als het in het wintertijd valt of een -1 (default) als je het niet weet. Als je dus de tijd in seconden sinds epoch van dit moment wilt weten, kan dat zo:
echo mktime(date('h'), date('i'), date('s'), date('m'), date('d'), date('Y'));
?>
Opmerking 1:
De argumenten van mktime() zijn niet verplicht. Als je ze niet invult wordt de huidige datum en tijd gepakt. Oftewel, de echo-statement hierboven had ook simpelweg echo mktime(); kunnen zijn geweest.
Opmerking 2:
Je kan met mktime() ook rekenen. Als je bijvoorbeeld de dag over 3 dagen wilt weten, kan dat d.m.v. dit scriptje:
echo date('d', mktime(date('h'), date('i'), date('s'), date('m'), date('d') + 3, date('Y')));
?>
In de vorige vraag behandelden we al hoe je van een bepaalde tijd het aantal seconden sinds epoch kunt berekenen. Als je dit voor twee tijden doet, kun je uiteraard het verschil in seconden tussen deze twee tijden berekenen door de twee omgerekende tijden van elkaar af te trekken. Het verschil in weken en e.d. kan op deze manier berekend worden (waarbij alles naar beneden wordt afgerond):
$tijd1 = mktime();
$tijd2 = mktime('14', '21', '4', '4', '3', '2006'); // 3 april 2006, 14:21:04 uur
// Verschil in seconden
$verschil = $tijd1 - $tijd2;
// Verschil in minuten
$verschilMinuten = floor($verschil/60);
// Verschil in uren
$verschilUren = floor($verschil/(60*60));
// Verschil in dagen
$verschilDagen = floor($verschil/(24*60*60));
// Verschil in jaren
$verschilJaren = floor($verschil/(24*60*60*365));
?>