BLOGS
Timestamp mon amour (3)
Nous avons vu dans les billets précédents que l'utilisation d'un timestamp basé sur un entier long avec référentiel apporte beaucoup en terme d'efficacité, de gain de place et de performance. Voyons à présent comment coder la conversion date et heure vers timestamp et inversement.
Finalement le timestamp se résume à un décompte du nombre de secondes par rapport à une date de référence. Pour faire simple, on va prendre comme date de référence, le 1er Janvier 2000. Cela nous permet d'aller jusqu'en 2068. Pourquoi 2068 et non 2136 comme l'auraient laissé supposer les 136 ans correspondant aux 4 milliards de secondes ? En fait, les entiers longs de 4D sont signés, il faut donc bien penser que la valeur 0 se trouve au milieu de la plage des valeurs possibles. Par conséquent nos timestamps nous permettent de naviguer entre les années 1932 et 2068. Rien ne vous empêche de décaler votre date de référence pour couvrir au mieux vos besoins.
Voici le code que je vous propose pour encoder un timestamp :
C_DATE($1;$date_ref;$date_reference)
C_HEURE($2;$heure_ref)
C_ENTIER LONG($0;$heure_en_seconde;$seconde;
¬ $minute_en_seconde;$jours_en_seconde)
Au cas ou
: (Nombre de parametres=0)
$date_ref:=Date du jour
$heure_ref:=Heure courante
: (Nombre de parametres=1)
$date_ref:=$1
$heure_ref:=Heure courante
: (Nombre de parametres=2)
$date_ref:=$1
$heure_ref:=$2
Fin de cas
$date_reference:=Ajouter a date(!00/00/00!;2000;1;1)
$heure_en_seconde:=$heure_ref+0
$jours_en_seconde:=($date_ref-$date_reference)*86400
$0:=$jours_en_seconde+$heure_en_seconde
La méthode que j'appelle TimeStamp_Ecrire accepte une date et une heure et retourne le timestamp correspondant. Noter que les paramètres sont optionnels.
4D ne permettant de retourner qu'une valeur via une fonction (sauf à passer par des pointeurs), je vous propose donc deux méthodes pour retrouver la date et l'heure depuis un timestamp :
C_ENTIER LONG($1;$nbjours)
C_DATE($0;$date_reference)
$date_reference:=Ajouter a date(!00/00/00!;2000;1;1)
$nbjours:=$1\ 86400
$0:=$date_reference+$nbjours
C_ENTIER LONG($1;$seconde;$Minute;$heure)
C_HEURE($0)
$seconde:=$1%60
$Minute:=($1\60)%60
$heure:=($1\3600)%24
$0:=Heure(Chaine($heure;"00")+":"+Chaine($minute;"00")
¬ +":"+Chaine($seconde;"00"))
Le décodage est basé sur des divisions entières (\) et des modulos (%) qui sont des opérations adorées par les processeurs, donc très rapides. Notez aussi l'utilisation de la fonction Ajouter a date pour construire la date de référence. Le choix de cette écriture assure la comptabilité du code quels que soient les réglages du système pour le formatage des dates.
Les méthodes ci-dessus étant extrêmement simples, je n'hésite jamais à utiliser un timestamp. J'adore véritablement cette façon de coder les instants que je dois mémoriser dans mes bases de données. En dernière analyse, j'ai la satisfaction de n'utiliser que des entiers longs qui sont, comme tout type simple, favorisés au niveau du moteur de 4D, du système et du processeur. Mes recherches sont plus simples, mes tris peuvent être indexés, les calculs de décalage sont basiques...













Poster un nouveau commentaire