Page 1 sur 1

[Ex] Autour du TimeStamp

Posté : mer. 02 févr. 2011 21:46
par timmalos
Bonjour à tous. J'ai été confronté a un petit problème que j'ai pu résoudre recemment, je vais donc partager avec vous ces petits details concernant les TimeStamps au cas ou quelqu'un en aurait besoin.

Pour ceux qui ne savent pas ce que c'est, Go Wikipedia :http://en.wikipedia.org/wiki/Unix_time
Donc en Autoit, pour connaitre le Timestamp Unix, c'est avec cette fonction :

Code : Tout sélectionner

#include <date.au3>
$iTimeStamp = _DateAdd('s', $unixtime, "1970/01/01 00:00:00")
Qui va calculer le nombre de secondes entre votre temps et le premier janvier 1970.
Le problème qui se pose, c'est que la majorité des TimeStamp Unix qu'on peut trouver sur le web, par exemple avec PHP, retournent la Valeur du timestamp selon le fuseau horaire UTC.

Hors en France, nous ne sommes pas en UTC comme vous le savez mais en UTC+1, mais vous me direz il suffit d'enlever 3600 secondes et le tour est joué, mais il reste le problème de l'heure d'hiver/heure d'été qui se pose, car on passe en UTC+2 pendant l'été, et comme en bons francais on aime se compliquer la tache, la date de changement d'heures change tous les ans, impossible de se caler sur le calendrier.

Voila donc comment vous y prendre :

Code : Tout sélectionner

#include <date.au3>
$unixtime = 1272700408
$timezone = _Date_Time_GetTimeZoneInformation()
$unixtime = $unixtime - ($timezone[1] + $timezone[7]) * 60
$iDateCalc = _DateAdd('s', $unixtime, "1970/01/01 00:00:00")
Et comme je vous aime bien, je partage une fonction qui est plus rapide que _DateAdd en faisant la même chose si vous avez beaucoup de conversions à faire , Disponible ici :

Code : Tout sélectionner

Func _EPOCH_decrypt($epoch_time)
    Local $Day2Add = Int($epoch_time / 86400)
    Local $iTimeVal = Mod($epoch_time, 86400)
    If $iTimeVal < 0 Then
        $Day2Add -= 1
        $iTimeVal += 86400
    EndIf
    Local $i_wFactor = Int((573371.75 + $Day2Add) / 36524.25)
    Local $i_xFactor = Int($i_wFactor / 4)
    Local $i_bFactor = 2442113 + $Day2Add + $i_wFactor - $i_xFactor
    Local $i_cFactor = Int(($i_bFactor - 122.1) / 365.25)
    Local $i_dFactor = Int(365.25 * $i_cFactor)
    Local $i_eFactor = Int(($i_bFactor - $i_dFactor) / 30.6001)
    Local $asDatePart[3]
    $asDatePart[2] = $i_bFactor - $i_dFactor - Int(30.6001 * $i_eFactor)
    $asDatePart[1] = $i_eFactor - 1 - 12 * ($i_eFactor - 2 >= 13)
    $asDatePart[0] = $i_cFactor - 4716 + ($asDatePart[1] < 3)
    Local $asTimePart[3]
    $asTimePart[0] = Int($iTimeVal / 3600)
    $iTimeVal = Mod($iTimeVal, 3600)
    $asTimePart[1] = Int($iTimeVal / 60)
    $asTimePart[2] = Mod($iTimeVal, 60)
    Return SetError(0, 0, StringFormat("%.2d/%.2d/%.2d %.2d:%.2d:%.2d", $asDatePart[0], $asDatePart[1], $asDatePart[2], $asTimePart[0], $asTimePart[1], $asTimePart[2]))
EndFunc   ;==>_EPOCH_decrypt
 

Exemples:
► Afficher le texte

Re: [Ex] Autour du TimeStamp

Posté : mar. 15 mars 2011 13:12
par sksbir
Bonjour, et merci pour ce partage qui peut être très utile :) ( enfin, jusqu'en 2038 il me semble... :lol: )

En plus, grâce à toi, je viens de découvrir encore une fonction hallucinante dans autoit : _Date_Time_GetTimeZoneInformation() , ainsi que toutes les fonctions de la même bibliothèque...

Re: [Ex] Autour du TimeStamp

Posté : ven. 26 août 2011 12:38
par aurel2108
Désolé de remonter ce topic mais j'aurais aimé savoir si il y avait possibilité de faire l'inverse, c'est à dire transformer un timestamp en date normale ? :/

Re: [Ex] Autour du TimeStamp

Posté : ven. 26 août 2011 13:01
par Tlem
Cet exemple issu de la documentation de DateAdd() vous convient-il ?

Code : Tout sélectionner

; Calculated eventlogdate which returns second since 1970/01/01 00:00:00
$sNewDate = _DateAdd( 's',1087497645, "1970/01/01 00:00:00")
MsgBox( 4096, "", "Date: " & $sNewDate )

Re: [Ex] Autour du TimeStamp

Posté : ven. 26 août 2011 14:00
par aurel2108
Merci beaucoup Tlem, c'est exactement ce que je cherchais. :D
Et encore désolé du déterrage de topic. :/