Convertir date+heure en string vers FILETIME

Résolu
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 - 19 févr. 2007 à 14:29
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 - 19 févr. 2007 à 22:57
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, @+
A voir également:

8 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
19 févr. 2007 à 15:05
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
19 févr. 2007 à 15:02
tu dois pouvoir utiliser DateDiff
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
19 févr. 2007 à 15:28
Violent Ken

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

Merci, @+
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
19 févr. 2007 à 15:45
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 ?

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
19 févr. 2007 à 15:56
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à, @+
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
19 févr. 2007 à 16:03
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





@+
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
19 févr. 2007 à 20:46
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
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
19 févr. 2007 à 22:57
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.

@+
Rejoignez-nous