pitipilot
Messages postés112Date d'inscriptionmercredi 19 mai 2010StatutMembreDernière intervention14 mai 2021
-
3 mai 2011 à 16:23
cs_cheyenne
Messages postés693Date d'inscriptionsamedi 18 mai 2002StatutMembreDernière intervention17 avril 2017
-
5 mai 2011 à 19:13
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 ?
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201578 3 mai 2011 à 19:58
Salut
Grâce aux APIs :
SystemTimeToTzSpecificLocalTime, TzSpecificLocalTimeToSystemTime, GetTimeZoneInformation
et pour l'internationalisation du format des dates :
GetDateFormat, GetTimeFormat, GetSystemDefaultLCID
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)
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201578 3 mai 2011 à 21:17
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.
cs_cheyenne
Messages postés693Date d'inscriptionsamedi 18 mai 2002StatutMembreDernière intervention17 avril 20172 3 mai 2011 à 23:57
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
pitipilot
Messages postés112Date d'inscriptionmercredi 19 mai 2010StatutMembreDernière intervention14 mai 20211 4 mai 2011 à 09:56
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
pitipilot
Messages postés112Date d'inscriptionmercredi 19 mai 2010StatutMembreDernière intervention14 mai 20211 4 mai 2011 à 10:17
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 =(.
pitipilot
Messages postés112Date d'inscriptionmercredi 19 mai 2010StatutMembreDernière intervention14 mai 20211 4 mai 2011 à 12:12
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
pitipilot
Messages postés112Date d'inscriptionmercredi 19 mai 2010StatutMembreDernière intervention14 mai 20211 4 mai 2011 à 16:53
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 =).
cs_cheyenne
Messages postés693Date d'inscriptionsamedi 18 mai 2002StatutMembreDernière intervention17 avril 20172 4 mai 2011 à 18:43
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.
cs_cheyenne
Messages postés693Date d'inscriptionsamedi 18 mai 2002StatutMembreDernière intervention17 avril 20172 4 mai 2011 à 18:53
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.
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201578 4 mai 2011 à 21:33
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.
pitipilot
Messages postés112Date d'inscriptionmercredi 19 mai 2010StatutMembreDernière intervention14 mai 20211 5 mai 2011 à 08:06
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.
pitipilot
Messages postés112Date d'inscriptionmercredi 19 mai 2010StatutMembreDernière intervention14 mai 20211 5 mai 2011 à 15:11
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;
pitipilot
Messages postés112Date d'inscriptionmercredi 19 mai 2010StatutMembreDernière intervention14 mai 20211 5 mai 2011 à 15:50
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.
cs_cheyenne
Messages postés693Date d'inscriptionsamedi 18 mai 2002StatutMembreDernière intervention17 avril 20172 5 mai 2011 à 19:13
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.