Convertir heure UTC en heure GMT +1 VBA

Signaler
Messages postés
112
Date d'inscription
mercredi 19 mai 2010
Statut
Membre
Dernière intervention
14 mai 2021
-
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
-
Bonjour, je récupère sur une base de données SQL Server des infos sur une supervision. Je dois ensuite traiter cette BDD sur Excel. Sauf que, problème, la supervision envoi les informations avec un timestamp en heure UTC.


Comment pourrais-je convertir l'heure de toute une colonne excel de UTC à l'heure locale ?



Merci d'avance

17 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
76
Salut

Grâce aux APIs :
SystemTimeToTzSpecificLocalTime, TzSpecificLocalTimeToSystemTime, GetTimeZoneInformation
et pour l'internationalisation du format des dates :
GetDateFormat, GetTimeFormat, GetSystemDefaultLCID

Tu trouveras des exemples VB6 (facilement transformables VBA) dans ce logiciel d'aide http://logiciel.codes-sources.com/logiciels/API-Guide-197.aspx et sur internet.

Pub perso : J'ai professionnellement développé un module compatible VBA avec les fonctions liées à ces calculs de décalages horaires (heures d'hiver/été) et aux formats des heures = f(langue OS), US FR).

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
112
Date d'inscription
mercredi 19 mai 2010
Statut
Membre
Dernière intervention
14 mai 2021
1
Merci beaucoup pour ta réponse rapide, étant donné que je suis vraiment novice en VBA tu ne pourrais pas m'aider à ajuster une date UTC vers GMT +1 ?
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
76
Je t'ai donné tous les éléments.
Tu n'as plus qu'à les digérer en testant les exemples que tu trouveras très facilement avec ces APIs.
As-tu seulement tapé "UTC" ou "GMT" dans la recherche des codes (sauf .Net) ?

Le site n'a pas pour vocation de remplacer les professionnels, mais d'aiguiller les développeurs.
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
Bonjour,

GMT n'est plus utilisé, c'est périmé.
UTC vers GMT + 1 = UTC + 1,
donc tu rajoutes simplement une heure à ta date.

Jack t'as en effet donné tous les éléments.

Maintenant, si tu veux passer de l'UTC à l'heure locale il te suffit de récupérer simplement le décalage avec l'API GetTimeZoneInformation et de l'ajouter à ton heure UTC.

Cheyenne
Messages postés
112
Date d'inscription
mercredi 19 mai 2010
Statut
Membre
Dernière intervention
14 mai 2021
1
Jack -> J'ai regardé l'API guide c'est vraiment pas mal sauf que lorsque je test un code il me met : Erreur de compilation, utilisation incorrect du mot clé Me

cheyenne -> Eh bien je pensait récupérer l'heure local, la soustraire à l'heure de mes timestamp, et ajouter cette différence à ces timesstamps

Je récupère grace à "GetTimeZoneInformation" le fuseau horaire sur lequel mon pc est configuré (Paris, Madrid) mais j'aimerai récupérer cela sous forme de date et j'ai essayé quelques bidouilles mais ma msgbox n'affiche rien.

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 Integer
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
Dim strBuffer As String

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
strBuffer = strBuffer & Chr(tZone.StandardName(i)) 'convert the ASCII code into a character'
Next

GetTimeZone = strBuffer
End Function


Private Sub Command1_Click()
MsgBox GetTimeZone
End Sub
Messages postés
112
Date d'inscription
mercredi 19 mai 2010
Statut
Membre
Dernière intervention
14 mai 2021
1
En faite la soustraction des heures puis l'ajout de la fifférence dans les timestamps ne marcherait pas puisque ces timestamps sont enregistré et non en temps réel =(.
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
Bonjour,

Tu y es presque... Tu as dans ton code :
lngRet = GetTimeZoneInformation(tZone)
lngRet te retourne 1 ou 2 selon l'horaire Hiver/Eté.

Tu n'as besoin que de la première partie de ton code (les déclarations) en y ajoutant
Dim tZone As TIME_ZONE_INFORMATION

Tu peux remplacer :
(0 To 31) As Integer par As String * 64

Quant à ton erreur Me, je pense que tu fais appel à ta Form à partir d'un module. Il faut remplacer Me par le nom de ta Form

Si tu as des timestamps enregistrés en Hiver ou en Eté, il va falloir tester les dates pour ajouter le bon décalage.

Cheyenne
Messages postés
112
Date d'inscription
mercredi 19 mai 2010
Statut
Membre
Dernière intervention
14 mai 2021
1
Ah ça marche j'ai plus qu'à récupérer la valeur de lngRet et l'additionner à l'heure de mes timesstamps, je met mon code à dispo une fois ma macro finie. Merci encore pour toutes vos réponses
Messages postés
112
Date d'inscription
mercredi 19 mai 2010
Statut
Membre
Dernière intervention
14 mai 2021
1
Bon j'y suis presque, je récupère le décallage horaire (+1 ou +2 en fonction de l'heure d'été ou d'hiver) par rapport à l'UTC. Il me suffit donc d'incrémenter les TimeStamps avec cette valeur.


Tout d'abord voici le code pour récupérer le décallage horaire

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


MsgBox lngret 'affichage du décallage horaire'
End Function


Maintenant je veux récupérer la valeur de "lngret" et l'incrémenter à des cellules dans ma colonne I dont le format est jj/mm/aaaa hh/mm .

Private Sub Workbook_Open()


Dim derniere_ligne As Integer
Dim j As Integer
Dim sj As String
Dim Decallage As Integer
Dim Date_gmt As Date


Decallage = CInt(lngret)


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 = ("I"+sj).value + decallage/24


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

Next
End Sub



Sauf que problème, d'une part je n'ai aucune idée de la manière de récupérer la valeur de lngret dans la fonction ci dessus mais VBA me précise que mon code n'est pas bon =(.

En tout cas j'y suis presque et ça grâce à l'aide que j'ai eu sur ce forum =).
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
Re,

Je t'avais signalé que tu n'a pas besoin de ta fonction. D'ailleurs ta fonction ne retourne rien il faut mieux faire une Sub, mais là c'est inutile.

Dans ta Sub Private Sub Workbook_Open() tu code :
Dim tZone As TIME_ZONE_INFORMATION
decalage = Cint(GetTimeZoneInformation(tZone))

(décalage s'écrit avec un seul l)

L'appellation de la variable sDate_gmt est fausse
puisque tu rajoutes le décalage, mets plutôt sDate_locale
Je t'ai indiqué également que le temps GMT n'est plus employé... donc à bannir.

Cheyenne
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
Re,

Sans indiscrétion, ils proviennent d'où tes timestamps ? Est-il bien utile de les convertir en heure locale ?
Comme dit précédement, pour avoir une heure locale correcte il faut tenir compte des deux périodes Hiver/Eté, il faut donc déterminer dans quelle période se situe la date UTC.

Cheyenne
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
76
Dans ton programme, cette ligne n'est pas correcte :
sDate_gmt = ("I"+sj).value + decallage/24
D'une part, parce que la variable sDate_gmt n'est pas définie|déclarée, d'autre part, parce qu'il semble manquer le Range à droite du =
Pour modifier|calculer des dates, il faut utiliser les fonctions adéquats : DateAdd et DateDiff

Avant de lancer ton programme, demande une compilation (menu débogage)
Si tu as une erreur, précise laquelle et sur quelle ligne.

Oui, ces données représentent l'état d'un process.
Par acquit de précision, le logiciel enregistre les vecteurs en heure UTC, mais à l'affichage, il convient de les afficher en heure locale, l'opérateur qui visualise les courbes doit pouvoir faire référence à une heure précise sans lui demander de calculer l'heure UTC.
Messages postés
112
Date d'inscription
mercredi 19 mai 2010
Statut
Membre
Dernière intervention
14 mai 2021
1
Cheyenne : L'heure du serveur sur lequel je traite la BDD est en heure GMT+1, je dois travailler avec. J'effectue une traçabilité des actions effectuées en manuelle par les opérateur sur la supervision d'où l'importance d'avoir un timestamps puisque le but final de mon projet est de pouvoir trier ma BDD par Date.

Jack : Je vais essayé ça


Merci à vous deux pour votre aide.
Messages postés
112
Date d'inscription
mercredi 19 mai 2010
Statut
Membre
Dernière intervention
14 mai 2021
1
Bonjour, il manquait effectivement un Range pour que la date UTC soit remplacée par celle GMT+1.

Il ne me reste plus qu'à effectuer des requêtes à ma BDD SQL Server 2005 du genre :

Select Champ1, Champ2, date From MaTable where date = "DateDeMonChoix"


Sauf que malheureuresement, je n'ai aucune idée de la manière de communiquer avec ma BDD via VBA excel j'ai juste trouvé la chaine de connection correspondant à SQL Server 2005

Data Source=myServerAddress;Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword;



Merci pour votre aide et bonne journée.
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
Bonjour,

Le serveur ne se met pas automatiquement à l'heure d'été ? serait-il en permanence à l'heure d'hiver ?

Si c'est le cas il faut oter 1 au décalage.
Donc pas de changement pour les dates correspondant à la période hiver et +1 pour la période été.

...la date UTC soit remplacée par celle GMT+1.
Plus de GMT !!! GMT a été remplacé par UTC depuis 1972


Cheyenne
Messages postés
112
Date d'inscription
mercredi 19 mai 2010
Statut
Membre
Dernière intervention
14 mai 2021
1
Eh bien la supervision me donne une heure UTC fixe, lorsque nous passons à l'heure d'été, le décallage entre l'heure d'été et l'heure UTC est de 2 heures. Il est de 1 heures pour l'heure d'hiver.
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
Re,

Ok, alors tu peux, tu peux utiliser ton décalage sans problème, mais tu me disais que le serveur avec lequel tu traites la BDD est à "GMT" +1, d'où ma remarque.
Il faudrait essayer d'être constant d'un post à l'autre, sinon on ne s'en sortira pas.

Tu me dis une heure UTC fixe. L'heure UTC n'est pas fixe, elle n'est pas affectée par les changements Hiver/Eté, ce qui n'est pas la même chose. L'heure UTC est la même pour le monde entier, quel que soit l'hémisphère. Quand il est 12.00 UTC à Moscou il est également 12.00 UTC à Paris et à New-York ainsi qu'à Melbourne.

Bonne continuation,
Cheyenne