[Catégorie modifiée .Net -> VBA] Appliquer un décalage automatique sur une date

Résolu
pitipilot Messages postés 112 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 14 mai 2021 - 10 mai 2011 à 16:55
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 - 11 mai 2011 à 22:02
Bonjourà tous, voilà j'ai un problème car mes champs de ma BDD sont en heures UTC et j'aimerais que lors de mes requêtes via VBA, celles ci soit en heures locales. Voici mon code :

Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type

Private Type TIME_ZONE_INFORMATION
Bias As Long
StandardName(0 To 31) As Integer
StandardDate As SYSTEMTIME
StandardBias As Long
DaylightName(0 To 31) As String * 64
DaylightDate As SYSTEMTIME
DaylightBias As Long
End Type
Private Declare Function SetTimeZoneInformation Lib "kernel32" (lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long
Private Declare Function GetTimeZoneInformation Lib "kernel32" (lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long

Public Function GetTimeZone() As String
Dim tZone As TIME_ZONE_INFORMATION
Dim lngret As Long
Dim i As Long


lngret = GetTimeZoneInformation(tZone)

For i = 0 To 31 ' the array's range is from 0 to 31'
If tZone.StandardName(i) = 0 Then Exit For

Next


End Function

Private Sub Workbook_Open()

Dim lngret As Long
Dim derniere_ligne As Integer
Dim j As Integer
Dim sj As String
Dim Decalage As Integer
Dim sDate_gmt As Date
Dim tZone As TIME_ZONE_INFORMATION



Decalage = CInt(GetTimeZoneInformation(tZone))


derniere_ligne = Range("I2").SpecialCells(xlCellTypeLastCell).Row 'acquisition dernière ligne colonne I'
 

For j = 2 To derniere_ligne   'début boucle For'

sj = CStr(j) 'conversion entier en string'



sDate_gmt = Range("I" + sj).Value + Decalage / 24


Range("I" + sj).Value = sDate_gmt

Next
End Sub


Voilà donc je récupère le décalage horaire (1h en heure d'hiver et 2 en heures d'été). J'ajoute ce décalage à mes dates et hop nikel sauf que...
Si je vais récupérer des enregistrements de ma BDD datant de l'heure d'hiver maintenant je vais ajouter 2 heures et vice versa.

Comment pouvoir convertir automatiquement une DateTime avec le décalage horaire qui lui correspond ?

33 réponses

pitipilot Messages postés 112 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 14 mai 2021 1
11 mai 2011 à 15:14
Désolé Jack je n'avais pas vu tes posts précédents, tu réponds à ma question avant même que je te la pose c'est parfait. Bonne journée.
0
pitipilot Messages postés 112 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 14 mai 2021 1
11 mai 2011 à 15:45
J'ai essayé le code Jack voici ce que ça donne :

Public Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type

Public Type TIME_ZONE_INFORMATION
Bias As Long
StandardName(0 To 31) As Integer
StandardDate As SYSTEMTIME
StandardBias As Long
DaylightName(0 To 31) As String * 64
DaylightDate As SYSTEMTIME
DaylightBias As Long
End Type
Private Declare Function SetTimeZoneInformation Lib "Kernel32" (lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long
Private Declare Function GetTimeZoneInformation Lib "Kernel32" (lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long
Private Declare Function TzSpecificLocalTimeToSystemTime Lib "Kernel32" (ByRef TimeZoneInfo As TIME_ZONE_INFORMATION, ByRef Local_Time As SYSTEMTIME, ByRef UTC_Time As SYSTEMTIME) As Long





Public Function ConvertLocalTimeToUtcTime(ByVal LocalDateTime As Date) As Date

    ' L'heure fournie est exprimée en heure locale et au format du système
    ' L'heure renvoyée sera exprimée en UTC, et toujours au format du système
    ' Accepte n'importe quel format de date du moment que ce format est le format de l'OS
    
    Dim tzi         As TIME_ZONE_INFORMATION
    Dim UtcTime     As SYSTEMTIME
    Dim LocalTime   As SYSTEMTIME
    
    Call GetTimeZoneInformation(tzi)
    With LocalTime
        .wDay = Day(LocalDateTime)
        .wMonth = Month(LocalDateTime)
        .wYear = Year(LocalDateTime)
        .wHour = Hour(LocalDateTime)
        .wMinute = Minute(LocalDateTime)
        .wSecond = Second(LocalDateTime)
    End With
    
    Call TzSpecificLocalTimeToSystemTime(tzi, LocalTime, UtcTime)
    
    With UtcTime
        ConvertLocalTimeToUtcTime = CDate(DateSerial(.wYear, .wMonth, .wDay) & _
                                          " " & _
                                          TimeSerial(.wHour, .wMinute, .wSecond))
    End With
    
End Function

Sub Bouton3()
Dim UtcDateTime As Date
Dim TempsLocal As Date
 TempsLocal = Format(Feuil1.DTPicker1.Value, "dd/mm/yyyy hh:mm") 'date UTC'
UtcDateTime = ConvertLocalTimeToUtcTime(TempsLocal) 'Date locale'

End Sub



Mais j'ai un message d'erreur :
Point d'entrée TzSpecificLocalTimeToSystemTime d'une DLL introuvable dans Kernel32
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
11 mai 2011 à 15:59
Outch
Je n'avais pas vu que tu travaillais sous VB.Net (catégorie de la question)
Toutes les déclarations que je t'ai passées sont compatibles VB6/VBA.
En VB.Net, il te faut remplacer :
- les Integer par des Short
- les Long par des Integer
De plus, la déclaration de la structure TIME_ZONE_INFORMATION n'est pas conforme à ce que je t'ai fourni. A revérifier, surtout le DaylightName.

Comme expliqué dans le lien qui accompagnait les déclarations, ces fonctions compatibles avec Shell32 à partir de Windows XP.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
11 mai 2011 à 16:03
Bah non, c'est pour du VBA (vous pouvez pas prendre 30 sec pour choisir correctement vos catégories, non, grrr)

Donc, laisse tomber les Integer/Long/Short et revoie la définition des structures Type.
0

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

Posez votre question
pitipilot Messages postés 112 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 14 mai 2021 1
11 mai 2011 à 16:03
Non jack Désolé c'est moi qui ai mal renséeigné mes Tags je suis sous VBA excuse moi je corrige ça de suite.
0
pitipilot Messages postés 112 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 14 mai 2021 1
11 mai 2011 à 16:09
D'après ton lien concernant l'API TzSpecificLocalTimeToSystemTime

Requirements
Minimum supported client
Windows XP
Minimum supported server
Windows Server 2003
Header
Winbase.h (include Windows.h)
Library
Kernel32.lib
DLL
Kernel32.dll


Je suis sur Windows 2000 C'est à cause de ça le message d'erreur je présume
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
11 mai 2011 à 16:35
... et oui, hélas.
Donc là, il va falloir faire avec d'autres APIs, ça doit exister, mais seront surement d'accès moins directe.
Je pense qu'il faudrait que tu te limites aux APIs présentes dans API-Guide (qui est vieux, aussi)
0
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
11 mai 2011 à 17:24
Bonjour,

> Jack : Hé bé, tu es particulièrement prolixe aujourd'hui
En tous cas, merci pour les fonctions de conversion qui me sont également utiles. Désormais je n'aurai plus besoin de "tartiner" les dates et je vais de ce pas modifier mes anciens codes.

Bonne continuation,

Cheyenne
0
pitipilot Messages postés 112 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 14 mai 2021 1
11 mai 2011 à 17:27
Heureusement, Mon application finale sera sur un MS Server 2003, donc ça passera. Eh bien voilà cette histoire de date enfin réglé merci encore
0
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
11 mai 2011 à 17:41
Re,

Pour information, ces deux structures fonctionnent très bien avec VB6 et Windows 7.
Private Type TIME_ZONE_INFORMATION
   Bias           As Long
   StandardName   As String * 64
   StandardDate   As SYSTEMTIME
   StandardBias   As Long
   DaylightName   As String * 64
   DaylightDate   As SYSTEMTIME
   DaylightBias   As Long
End Type

Private Type TIME_ZONE_INFORMATION
    Bias             As Long
    StandardName(32) As Integer
    StandardDate     As SYSTEMTIME
    StandardBias     As Long
    DaylightName(32) As Integer
    DaylightDate     As SYSTEMTIME
    DaylightBias     As Long
End Type


Cheyenne
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
11 mai 2011 à 18:44
De rien
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
11 mai 2011 à 19:14
Oui, mais ceci ne serait pas passé :
DaylightName(0 To 31) As String * 64
La structure demande 64 bytes.
Donc 64 bytes de String ou 32 entiers de 2 bytes, du moment que le compte y est. Les String semblent plus indiqués dans ce cas, en effet.
0
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
11 mai 2011 à 22:02
Re,

Suite du feuilleton...

ou DaylightName(0 To 63) As Byte (pour Unicode)

De plus il faut faire attention (0 to 31)
ou (1 to 32) As Integer
Car si StandardName et DaylightName (32) As Integer le DaylightBias reste à 0.

A la prochaine jack et bonne soirée,

Cheyenne
0
Rejoignez-nous