Conversion TimeStamp Microsoft

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
gold94
Messages : 2
Inscription : ven. 02/mars/2012 10:36

Conversion TimeStamp Microsoft

Message par gold94 »

Bonjour à tous

Débutant en PureBasic, mais pas en Basic (utilisateur du GFA sur Amiga, il y bien longtemps.....)
Je me casse les dents sur une histoire de conversion de TimeStamp, j'ai essayé la commande "date"
mais je n'arrive à rien.
En gros j'ai un fichier binaire provenant d'une station météo WS3600 et je dois y faire le ménage,
doublon de mesure à retirer, je lis sans problème les données, température, pression etc ..... mais
la date :( .
Je cherche donc à faire la conversion de 40909.001539351855 (timestamp Microsoft) --> 01/01/2012 00:02:13
et aussi l'inverse, la commande "Date" part du TimeStamp Unix et mon fichier utilise le timeStamp Microsoft (quelle idée ...).

Voila s'il y a des spécialistes du conversion de temps ...... je m'en remet à vous ....

Thierry
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Conversion TimeStamp Microsoft

Message par Backup »

je ne connais pas Timestamp ....

mais en Purebasic la fonction

Code : Tout sélectionner

debug FormatDate("A=%yyyy, M= %mm, J=%dd", date())
permet de retourner une date au format en fonction du nombre de secondes écoulées depuis le '01/01/1970 0:00:00').

Code : Tout sélectionner

;40909.001539351855 (timestamp Microsoft) --> 01/01/2012 00:02:13
Annee=1970
Mois=01
Jour=01
Heure=0
Minute=1
Seconde=0

e= Date(Annee, Mois, Jour, Heure, Minute, Seconde)
debug  "nombre de secondes depuis la date spécifiée   (01/01/ 1970 + 1 minute)   "+str(e)

; ******************************************************************************

e= Date()
debug  "nombre de secondes depuis la 01/01/1970:00:00:00      "+str(e)

debug "date du jour   :"+ FormatDate("Anné=%yyyy, Mois= %mm, Jours=%dd", e)


a partir de là , faut faire un convertisseur de valeur partant du "TimeStamp" :)

il existe apparemment un convertisseur en ligne ici :
http://www.timestamp.fr/

[reedit]

je lis :
Le timestamp (unix) désigne le nombre de secondes écoulées depuis le 1er janvier 1970 à minuit UTC précise
ça tombe bien la fonction Date() de purebasic aussi ;)

ce qui gene dans ton histoire c'est le chiffre a virgule ! car il semble que TimeStamp est un entier normalement

bon , ceci est un récapitulatif des fonctions Purebasic :)
Dernière modification par Backup le ven. 02/mars/2012 12:23, modifié 2 fois.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Conversion TimeStamp Microsoft

Message par djes »

Méthode empirique :

Code : Tout sélectionner

MyDate.d = 40909.001539351855

MyUnixDate.d = MyDate * 32398.15403
Debug FormatDate("%yyyy/%mm/%dd", MyUnixDate)
Debug FormatDate("%hh:%ii:%ss", MyUnixDate)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Conversion TimeStamp Microsoft

Message par comtois »

Moi j'ai un décalage de 133 secondes !

Code : Tout sélectionner

;En appliquant ça http://able2know.org/topic/70939-1
MS = 40909.001539351855
Unix.q = MS * 86400 - 2209161600
Debug Unix
Debug Date(2012, 01, 01, 0, 2, 13)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Re: Conversion TimeStamp Microsoft

Message par Droopy »

Code : Tout sélectionner

ProcedureDLL UnixToMSDosDate(UnixDate) ; Convert MsDos date to Unix date
  
  Protected Result, m
  
  m      = Year(UnixDate) - 1980
  Result | (m << 25)
  m      = Month(UnixDate)
  Result | (m << 21)
  m      = Day(UnixDate)
  Result | (m << 16)
  m      = Hour(UnixDate)
  Result | (m << 11)
  m      = Minute(UnixDate)
  Result | (m << 5)
  m      = Second(UnixDate) / 2
  Result | m
  
  ProcedureReturn Result
EndProcedure

Code : Tout sélectionner

ProcedureDLL MSDosDateToUnix(MSDos_Date) ; Convert Unix date to MsDos date
  
  Protected Result, y, m, d, H, Min, s
  
  y      = 1980 + (MSDos_Date >> 25) & $7F
  m      = (MSDos_Date >> 21) & $0F
  d      = (MSDos_Date >> 16) & $1F
  H      = (MSDos_Date >> 11) & $1F
  Min    = (MSDos_Date >> 5) & $3F
  s      = (MSDos_Date & $1F) * 2
  Result = Date(y, m, d, H, Min, s)
  
  ProcedureReturn Result
EndProcedure
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Re: Conversion TimeStamp Microsoft

Message par Droopy »

pourrait servir aussi :

Description : Get the time of a File
The 'which' parameter specifies which time you want to retrieve
0 = Time the File was created
1 = Time the file was last accessed
2 = Time the file was last written
Return 0 if it fails / Date in Purebasic format if successful

Code : Tout sélectionner

ProcedureDLL FileGetTime(File.s,Which); Get the time of a File 
  
  
  Result=0 
  Handle=CreateFile_(@File,#GENERIC_READ,#FILE_SHARE_READ|#FILE_SHARE_WRITE,0,#OPEN_EXISTING,#FILE_ATTRIBUTE_NORMAL,0) 
  If Handle<>#INVALID_HANDLE_VALUE 
    Select Which
      Case 1
        GetFileTime_(Handle,0,FT.FILETIME,0) 
      Case 2
        GetFileTime_(Handle,0,0,FT.FILETIME) 
      Default
        GetFileTime_(Handle,FT.FILETIME,0,0) 
    EndSelect
    
    Result=FileTimeToDate(FT) 
    CloseHandle_(Handle) 
  EndIf 
  ProcedureReturn Result 
EndProcedure 
 
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Conversion TimeStamp Microsoft

Message par comtois »

en fait j'ai oublié de mettre un flottant pour MS , mon calcul fonctionne

Code : Tout sélectionner

;En appliquant ça http://able2know.org/topic/70939-1
MS.d = 40909.001539351855
Unix.q = MS * 86400 - 2209161600
Debug Unix
Debug Date(2012, 01, 01, 0, 2, 13)  

Debug FormatDate("%yyyy/%mm/%dd", Unix)
Debug FormatDate("%hh:%ii:%ss", Unix)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Conversion TimeStamp Microsoft

Message par Backup »

@comtois
j'avais vu ton calcul ici : ( arf tu l'avais spécifié dans le code )
http://able2know.org/topic/70939-1
:)

ou ils expliquent que
The number of seconds in 25569 days is:
25569*24*60*60
= 2209161600
et que

The number of seconds in 1 day is:
24*60*60
= 86400
et que donc :
Code:HumanDate: Format(([unixdate]+2209161600)/86400,"dd/mm/yy hh:nn:ss")

avec tout ça notre ami gold94 a toutes les explications :D ( bravo a tous )
gold94
Messages : 2
Inscription : ven. 02/mars/2012 10:36

Re: Conversion TimeStamp Microsoft

Message par gold94 »

Vous êtes tous génial, un grand merci je vais pouvoir reprendre le fil de
mon programme, et faire le nettoyage dans mes fichiers météo pour les stats
2011, car suite à une modif du hardware de la station, celle-ci m'envoie 4 à 5
mesures par minute à la place d'une, résultat un fichier énorme et long très long a calculé ,
pour voir à quoi ressemble un graphe météo :
http://gold93.hd.free.fr/lameteo/index.html

Merci encore

Thierry
Répondre