Convertir date+heure en string vers FILETIME

Résolu
Signaler
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
-
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
-
Violent Ken

Bonjour, j'aimerais pouvoir convertir une string au format "DD-MM-YYYY HH:MM:SS" (ou autre, mais avec date et time dans une même string) vers un format FILETIME, SYSTEMTIME, ou Currency.

Je sais que FILETIME est le nombre d'intervalles de 100 nanosecondes écoulées depuis le 1er janvier 1601, mais je ne pense pas que ce soit une bonne idée de faire un calcul complexe du genre :
res = (année-1601)*nbre de 100ns dans 1 année + (mois-1)*.....
avec la prise en compte les années bisextiles, la conversion en temps local...etc. pour effectuer ma conversion...

Auriez vous une idée simple ? (pas trouvé sur le net)
Merci, @+

8 réponses

Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
tu dois pouvoir utiliser DateDiff
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Violent Ken

Ah, effectivement, j'oubliais les instructions Year, Month...etc. Cà marchera nickel en passant par un SYSTEMTIME.

Merci, @+
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
Je ne comprends pas la question .

Pour moi, la répose se résumerait à ceci :

Private Sub Command1_Click()
  madate = "01-01-2006"
  monheure = "02:12:26"
  mondateheure = DateValue(madate) & " " & TimeValue(monheure)
  MsgBox mondateheure
  madate = "01/01/2006"
  mondateheure = DateValue(madate) & " " & TimeValue(monheure)
  MsgBox mondateheure
End Sub

et ce serait toujours vrai
Que n'ai-je pas compris de ce que tu veux, donc ?
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Violent Ken

Heu non, en fait je veux pouvoir convertir une date et une heure en FILETIME (ou SYSTEMTIME ou Currency).

Autrement dit je veux pouvoir transformer
"19/02/2007 15:50:12" en 128163737995536414 (enregistré dans une currency, un FILETIME ou en SYSTEMTIME), cette valeur représentant le nombre de 100ns écoulées depuis le 1er janvier 1601. C'est ce format de date qui est utilisé par Windows.

Donc je vais faire :

Dim ST as SYSTEMTIME
ST.wDay=Day(ma date)
ST.wYear=Year(ma date)
...
ST.wHour=Hour(mon heure)
...

ensuite je fais :

Dim FT as FILETIME
et je convertis en FILETIME :

SystemTimeToFileTime ST,FT

et puis je me ramène à ma Currency :

CopyMemory MaCurrency, FT, LenB(FT)

Voilà, @+
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Violent Ken

Voilà, çà donne çà :





'=======================================================


'transforme une string (date) en currency


'=======================================================


Public Function DateString2Currency(ByVal sDate As String) As Currency
Dim FT As FILETIME
Dim d As Date
Dim t As Date
Dim ST As SYSTEMTIME

   d = DateValue(sDate)
   t = TimeValue(sDate)

   'transfome déjà en systemtime
   With ST
       .wDay = Day(d)
       .wMonth = Month(d)
       .wYear = Year(d)
       .wMinute = Minute(t)
       .wHour = Hour(t)
       .wSecond = Second(t)
   End With
   
   'passe en filetime
   SystemTimeToFileTime ST, FT
   
   'passe en currency
   DateString2Currency = FT2Currency(FT)
       
End Function


By Renfield





@+
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
Salut,
j'utilise déjà cette conversion dans les deux sens
faut tenir de l'heure locale et heure été/hiver
3600 en hiver et 7200 en été: a déterminer avec FileTimeToLocalFileTime avec 0 comme argument
je récupére aussi les secondes (seulement sur NTFS)

    Dim wdt As Currency
    Dim w   As Currency
    Dim s   As Integer
    Dim dt  As Date
    Dim wz  As Double
   
    wdt = CCur("12816373799553,6414")

    w = Int(wdt / 1000):
    s = (wdt - w * 1000):
    dt = (w + 3600) / 86400 - 109205
    MsgBox dt & " " & s
   
    wz = dt + 109205
    w = wz * 86400 - 3600
    wdt = w * 1000 + s
    MsgBox wdt

Daniel
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Violent Ken

Exact, j'ai oublié d'utiliser l'API FileTimeToLocalFileTime.

Pour la conversion dans l'autre sens, j'utilise ceci :





'=======================================================


'transforme une date en FILETIME vers une date en string


'Private Function FileTimeToString(fDate As FILETIME, Optional ByVal bConvertToLocal As Boolean True) As String
Dim sDate As SYSTEMTIME
Dim sDay As String
Dim sMonth As String
Dim sYear As String
Dim sHour As String
Dim sMinute As String
Dim sSecond As String
Dim s As String

   If bConvertToLocal Then
       'conversion en LocalFileTime (temps universel ==> temps local)
       FileTimeToLocalFileTime fDate, fDate
   End If
   
   'conversion en SystemTime
   FileTimeToSystemTime fDate, sDate
   
   'conversion en string vers un format du genre 24/04/2000 09:50:59
   sDay = Trim$(IIf(sDate.wDay < 10, "0" & Trim$(Str$(sDate.wDay)), Trim$(Str$(sDate.wDay))))
   sMonth = Trim$(IIf(sDate.wMonth < 10, "0" & Trim$(Str$(sDate.wMonth)), Trim$(Str$(sDate.wMonth))))
   sHour = Trim$(IIf(sDate.wHour < 10, "0" & Trim$(Str$(sDate.wHour)), Trim$(Str$(sDate.wHour))))
   sMinute = Trim$(IIf(sDate.wMinute < 10, "0" & Trim$(Str$(sDate.wMinute)), Trim$(Str$(sDate.wMinute))))
   sSecond = Trim$(IIf(sDate.wSecond < 10, "0" & Trim$(Str$(sDate.wSecond)), Trim$(Str$(sDate.wSecond))))
   sYear = sDate.wYear
   
   s = sDay & "/" & sMonth & "/" & sYear & " " & sHour & ":" & sMinute & ":" & sSecond
   FileTimeToString = s

End Function


By Renfield









Peut être pas très optimisé, mais c'est assez explicite.

@+