--- Soumis par Michel Walsh et Terry Kreft---
Changements d'heure (printemps/automne) et calcul de différence de temps.
On peut retrouver l'information des changement d'heure (printemps/automne) à l'aide de fonctions de l'API qui explorent le Registre du système. Comme bénéfices additionnels, on peut alors calculer précisément une différence en secondes ou en minutes entre deux dates_heures qui peuvent traverser un tel changement, une amélioration sur DateDiff.
'************************** Code Start *********************** 'This code was originally written by Terry Kreft & Michel Walsh 'It is not to be altered or distributed, 'except as part of an application. 'You are free to use it in any application, 'provided the copyright notice is left unchanged.
'Ce code fut originalement écrit par Terry Kreft & Michel Walsh 'Il ne doit être ni altéré, ni distribué 'sauf comme partie intégrée à une application. 'Vous êtes libre d'utiliser ce code 'à la condition de laisser cette note, sans modification.
'Code courtesy of
'Terry Kreft & Michel Walsh
'
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
Type TIME_ZONE_INFORMATION
Bias As Long
StandardName(31) As Integer
StandardDate As SYSTEMTIME
StandardBias As Long
DaylightName(31) As Integer
DaylightDate As SYSTEMTIME
DaylightBias As Long
End Type
Declare Function GetTimeZoneInformation Lib "kernel32" _
(lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long
Function PreciseDateDiff(Interval As String, ByVal Date1, ByVal Date2, _
Optional FirstDayOfWeek As Integer = vbSunday, _
Optional FirstWeekOfYear As Integer = vbFirstJan1) _
As Long
'D'une suggestion originale de Michel Walsh
'Obtenir DateDiff, qui tient compte des changement d'heure
'
' Exemple d'utilisation:
'
' ? PreciseDateDiff("h", #1/1/90#, #5/5/98#)
'
Dim lngRet As Long
Dim TZI As TIME_ZONE_INFORMATION
Dim strEval As String
If Eval("'" & Interval & "' in ('h','n','s')") Then
If FirstDayOfWeek >= 0 And FirstDayOfWeek <= 7 Then
If FirstWeekOfYear >= 0 And FirstWeekOfYear <= 3 Then
lngRet = GetTimeZoneInformation(TZI)
strEval = DateForSQL(Date1) & " between " _
& DateForSQL(SummerTime(Year(Date1))) & " and " _
& DateForSQL(StandardTime(Year(Date1)))
If Eval(strEval) Then
Date1 = DateAdd("n", TZI.DaylightBias, Date1)
End If
strEval = DateForSQL(Date2) & " between " _
& DateForSQL(SummerTime(Year(Date2))) & " and " _
& DateForSQL(StandardTime(Year(Date2)))
If Eval(strEval) Then
Date2 = DateAdd("n", TZI.DaylightBias, Date2)
End If
lngRet = DateDiff(Interval, Date1, Date2, _
FirstDayOfWeek, FirstWeekOfYear)
PreciseDateDiff = lngRet
End If
End If
Else
PreciseDateDiff = DateDiff(Interval, Date1, Date2, FirstDayOfWeek, FirstWeekOfYear)
End If
End Function
Private Function DateForSQL(dteDate) As String
DateForSQL = Format(dteDate, "\#m/dd/yyyy h:nn:ss AM/PM \#")
End Function
Public Function SummerTime(Optional intYear As Long = -1) As Date
' Originalement soumis par Terry Kreft
' modifié pour accepté une année (optionnel)
If -1 = intYear Then intYear = Year(Date)
' Cette année-ci, par défaut, non -1
Dim lngRet As Long
Dim TZI As TIME_ZONE_INFORMATION
lngRet = GetTimeZoneInformation(TZI)
With TZI.DaylightDate
SummerTime = CVDate(GetSundate(.wMonth, .wDay, _
intYear) + (.wHour / 24))
End With
End Function
Public Function StandardTime(Optional intYear As Long = -1) As Date
' Originalement soumis par Terry Kreft
' modifié pour accepté une année (optionnel)
If -1 = intYear Then intYear = Year(Date)
' Cette année-ci, par défaut, non -1
Dim lngRet As Long
Dim TZI As TIME_ZONE_INFORMATION
lngRet = GetTimeZoneInformation(TZI)
With TZI.StandardDate
StandardTime = CVDate(GetSundate(.wMonth, .wDay, _
intYear) + (.wHour / 24))
End With
End Function
Private Function GetSundate(intMonth As Integer, _
intSun As Integer, _
Optional intYear As Long = -1) _
As Date
' Originalement soumis par Terry Kreft
' modifié pour accepté une année (optionnel)
If intYear = -1 Then intYear = Year(Date)
' si non fourni, prendre cette année-ci
Dim varRet As Variant
Dim intDayOfWeek As Integer
varRet = DateSerial(intYear, intMonth, 1)
' éviter les problèmes d'options régionales
intDayOfWeek = WeekDay(varRet)
If intDayOfWeek <> 1 Then
varRet = DateAdd("d", 8 - intDayOfWeek, varRet)
End If
varRet = DateAdd("ww", intSun - 1, varRet)
GetSundate = varRet
End Function
'************************** Code End ***********************