Timestamps... Hoe vaak al niet behandeld. Zal het nu voor eens en altijd goed uitleggen ook.
Welke soort?
Er zijn verschillende manieren timestamps te maken. Eigenlijk zijn er 2 die echt handig zijn.
[list=1][*]De minst makkelijke van die 2 is de manier van MySQL. Met de column types DATETIME, DATE en TIMESTAMP kunnen datums gegenereerd worden die uiteenlopen van lengte en vorm.[*]Met de functie time() van PHP. Deze vorm wordt verreweg het meeste gebruikt omdat die heel veel verschillende mogelijkheden bied. Meer hierover, hieronder.[/list=1]
MySQL
Maar laten we beginnen met de mysql manier. Specificeer bij het aanmaken of aanpassen van een tabel dat het gewenste veld een DATETIME veld moet zijn. Je krijgt dan waarden in de vorm "YYYY-MM-DD HH:MM:SS". Tijdens inserts hoef je dan niets in te geven bij deze velden, ze updaten zich automatisch met gegevens van de server. De datum kun je dan later ook zo weer uit de database plukken zonder er iets mee te hoeven doen.
DATE werkt in dat opzicht hetzelfde alleen nu is de notatie alleen de datum, dus bv 'YYYY-MM-DD'.
TIMESTAMP is een ander verhaal. Deze moet je een bepaalde lengte meegeven die bepaald welke notatie gebruikt gaat worden. Een tabelletje:
TIMESTAMP(14) YYYYMMDDHHMMSS
TIMESTAMP(12) YYMMDDHHMMSS
TIMESTAMP(10) YYMMDDHHMM
TIMESTAMP(8) YYYYMMDD
TIMESTAMP(6) YYMMDD
TIMESTAMP(4) YYMM
TIMESTAMP(2) YY
Het nummer achter TIMESTAMP geeft aan hoe groot het veld moet zijn om de gewenste notatie erachter te krijgen (automatisch tijdens INSERT en UPDATE).
Het is bij mij overigens niet bekend welke notatie je krijgt als je geen even getal kiest of een getal groter dan 14. Het lijkt mij in het laatste geval logisch dat die ruimte dan gewoon niet benut wordt en dus onnodig ruimte verspild (aangezien TIMESTAMP types opgeslagen worden als INT's). In het eerste geval zou het kunnen zijn dat je misvormde datums krijgt...
Ook hier is er theoretisch niets meer nodig na ophalen uit de db om het te kunnen gebruiken. Alleen 20031121200744 is niet echt te gebruiken als datum notatie. Wil je echt de luilak uithangen dan is DATETIME natuurlijk de ideale oplossing. Streepjes en dubbele punten zijn al op hun plek. En ach, dat het engelse notatie is neemt men met zo'n instelling ook wel voor lief...
PHP
Deze methode vereist iets meer uitleg vrees ik. Maar wel de meest flexibele als je er alles nog mee wilt kunnen doen.
Timestamps van PHP gaan buiten enige db dan ook om. Een timestamp kan er zo uitzien:
1054789432
Nee, je kunt hier geen gewone datum van bakken, hoe je de cijfers ook omdraait. Wat stelt dit getal dan wel voor hoor ik je denken? Dit, mijn beste lezer, is het aantal seconden sinds het UNIX tijdperk. Deze begon op 1-1-1970 01:00:00. Probeer het maar eens uit zo meteen als je deze uitleg hebt gelezen: de timestamp "1" geeft (als het een ge-eikte serverklok is) als het goed is 1-1-1970 01:00:01 aan. Mits jij ook de goede formaten gebruikt. Want daar gaan we het nu over hebben.
Een timestamp genereer je met de functie time(). echo time(); zal dus resulteren in het aantal seconden sinds de UNIX epoch.
Echter, het aantal seconden is niet van belang voor ons. We willen een datum zien. Daarvoor zijn verschillende functies bedacht.
Daar kun je per functie ook de complete lijst met conversie specifiers vinden. Dit zijn afkortingen voor notaties van een datum/tijd die afkomstig is van een timestamp of, indien niet opgegeven, van de huidige tijd. Een paar voorbeelden in een scriptje verwerkt:
PHP Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| <?php
$stamp = 1054449217;
//Ik gebruik in dit voorbeeld de functie strftime() maar met wat aanpassingen zou hij ook goed werken met date()
echo strftime("%A %d %B %Y", $stamp)."<br>\n";
//Dit geeft dus: Sunday 01 June 2003
echo strftime("%d-%m-%Y, %H:%M:%S", $stamp)."<br>\n";
//Dit geeft dus: 01-06-2003, 08:33:37
echo strftime("%B %Y (%H:%M)", $stamp)."<br>\n";
//Dit geeft dus: June 2003 (08:33)
?> |
Dit zijn maar een paar voorbeelden uiteraard. Met de vele specifiers kun je bijna elke denkbare datum/tijd notatie in elke denkbare volgorde maken.
Je ziet, het systeem van PHP eist wat meer kennis en is misschien iets moeilijker maar je kunt er uiteindelijk wel veel meer mee. MySQL heeft de beperking dat je niet exact kunt opgeven in welk formaat je de datum wilt opslaan of eruit wilt krijgen. Of je moet al met veel substrings en replaces gaan werken om hetzelfde als hierboven te krijgen. PHP biedt overigens nog preciezere tijdnotatie. Microseconden zijn echter niet interessant voor de gewone surfer. Onze digitale horloges geven immers ook geen notatie als 14:44:12’’51’’’455’’’’5128. Microseconden in PHP worden echter wel gebruikt bij het berekenen van de parsetime van een bestand. Als het een snelle server is is dit een kwestie van duizendsten van seconden (0,007 seconden is niet uitzonderlijk) en zelfs bij een minder snelle is een pagina meestal binnen de 25 hondersten gegenereerd. Dan zijn microseconden super handig. Men start een “timer” aan het begin van het bestand en stopt hem aan het eind. Daar meet men weer de tijd en rekent het verschil ertussen uit, rond het af op 2 tot 4 decimalen et voila.
Ik hoop dat timestamps nu wat beter zijn te begrijpen. Nee, zo moeilijk is het ook niet maar je moet het ff door krijgen. Er worden namelijk nogal eens wat vragen over gesteld en ik vond het daarom wel eens tijd worden voor een tutorial. De volgende zal hoogstwaarschijnlijk gaan over het correct scripten en het gebruik van de $_POST, $_GET, $_REQUEST en $_SERVER superglobals.
Later he