检索当前本地机器与 UTC 时间的偏移小时数(VBA)
Retrieve current number of hours Local Machine is offset from UTC Time (with VBA)
人们在多个时区使用我的项目。
为了转换时间戳,仅检索 本地计算机使用 VBA 相对于 UTC 的当前小时数的最快方法是什么?
这里有两种 ready-to-use 方法来检索当前与 UTC 时间的小时数偏移量,仅此而已:
方法一:使用'any'API
Option Explicit
Function hoursOffsetFromUTC() As Single
'returns current #hours difference between UTC & Local System Time
'On Error GoTo uError
Dim xmlHTTP As Object, strUTC As String, dtUTC As Date
Set xmlHTTP = CreateObject("MSXML2.XMLHTTP")
xmlHTTP.Open "GET", "https://maps.googleapis.com/maps/api/" & _
"timezone/json?location=" & Int(Rnd() * 99) & ",0×tamp=" & Int(Rnd() * 99), False
xmlHTTP.send 'send randomized reqeust to avoid cached results
strUTC = Mid(xmlHTTP.getResponseHeader("date"), 6, 20)
Set xmlHTTP = Nothing
dtUTC = DateValue(strUTC) + TimeValue(strUTC)
hoursOffsetFromUTC = Round((Now() - dtUTC) * 48, 0) / 2 'nearest 0.5
Exit Function
uError:
MsgBox "Couldn't get UTC time." & vbLf & vbLf & _
"Err#" & Err & ": " & Err.Description, vbExclamation, "Error!"
End Function
- 用法示例:
MsgBox hoursOffsetFromUTC
方法二:使用WindowsAPI
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 LongPtr
StandardName(0 To 31) As Integer
StandardDate As SYSTEMTIME
StandardBias As LongPtr
DaylightName(0 To 31) As Integer
DaylightDate As SYSTEMTIME
DaylightBias As LongPtr
End Type
Private Declare PtrSafe Function GetTimeZoneInformation Lib "kernel32" _
(lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long
Function hoursOffsetFromUTC_Win() As Single
Dim TZI As TIME_ZONE_INFORMATION
If GetTimeZoneInformation(TZI) = 2 Then
hoursOffsetFromUTC_Win = 0 - ((TZI.Bias + TZI.DaylightBias) / 60)
Else
hoursOffsetFromUTC_Win = 0 - (TZI.Bias / 60)
End If
End Function
- 用法示例:
MsgBox hoursOffsetFromUTC_Win
方法一代码较少,但需要互联网连接。它使用随机数调用 Google API 以避免缓存,并忽略响应 body,它获取响应 header 中返回的请求日期并将其与本地系统时间。 (可以使用 header 中 returns 当前 UTC/GMT 的任何 API。)
方法二 需要声明两种类型和一个外部函数,但在没有互联网连接的情况下运行,使用来自 Windows' 内部的功能 kernel32
API。
转换时间戳:
将数字 Unix/epoch 时间戳转换为“Excel Time”:
( 时间戳 / 86400 ) + 25569 = Excel时间
或者反过来,从Excel到纪元时间戳:
( Excel时间 - 25569 ) * 86400 = 时间戳
(这些不包括时区调整,因此您可以根据需要add/subtract。)
更多信息:
维基百科:Unix Time & Digital Timestamps
奇普皮尔逊:Time Zones And Daylight Savings Time (Windows API)
堆栈溢出:Convert between arbitrary timezones(区域→区域)
人们在多个时区使用我的项目。
为了转换时间戳,仅检索 本地计算机使用 VBA 相对于 UTC 的当前小时数的最快方法是什么?
这里有两种 ready-to-use 方法来检索当前与 UTC 时间的小时数偏移量,仅此而已:
方法一:使用'any'API
Option Explicit
Function hoursOffsetFromUTC() As Single
'returns current #hours difference between UTC & Local System Time
'On Error GoTo uError
Dim xmlHTTP As Object, strUTC As String, dtUTC As Date
Set xmlHTTP = CreateObject("MSXML2.XMLHTTP")
xmlHTTP.Open "GET", "https://maps.googleapis.com/maps/api/" & _
"timezone/json?location=" & Int(Rnd() * 99) & ",0×tamp=" & Int(Rnd() * 99), False
xmlHTTP.send 'send randomized reqeust to avoid cached results
strUTC = Mid(xmlHTTP.getResponseHeader("date"), 6, 20)
Set xmlHTTP = Nothing
dtUTC = DateValue(strUTC) + TimeValue(strUTC)
hoursOffsetFromUTC = Round((Now() - dtUTC) * 48, 0) / 2 'nearest 0.5
Exit Function
uError:
MsgBox "Couldn't get UTC time." & vbLf & vbLf & _
"Err#" & Err & ": " & Err.Description, vbExclamation, "Error!"
End Function
- 用法示例:
MsgBox hoursOffsetFromUTC
方法二:使用WindowsAPI
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 LongPtr
StandardName(0 To 31) As Integer
StandardDate As SYSTEMTIME
StandardBias As LongPtr
DaylightName(0 To 31) As Integer
DaylightDate As SYSTEMTIME
DaylightBias As LongPtr
End Type
Private Declare PtrSafe Function GetTimeZoneInformation Lib "kernel32" _
(lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long
Function hoursOffsetFromUTC_Win() As Single
Dim TZI As TIME_ZONE_INFORMATION
If GetTimeZoneInformation(TZI) = 2 Then
hoursOffsetFromUTC_Win = 0 - ((TZI.Bias + TZI.DaylightBias) / 60)
Else
hoursOffsetFromUTC_Win = 0 - (TZI.Bias / 60)
End If
End Function
- 用法示例:
MsgBox hoursOffsetFromUTC_Win
方法一代码较少,但需要互联网连接。它使用随机数调用 Google API 以避免缓存,并忽略响应 body,它获取响应 header 中返回的请求日期并将其与本地系统时间。 (可以使用 header 中 returns 当前 UTC/GMT 的任何 API。)
方法二 需要声明两种类型和一个外部函数,但在没有互联网连接的情况下运行,使用来自 Windows' 内部的功能 kernel32
API。
转换时间戳:
将数字 Unix/epoch 时间戳转换为“Excel Time”:
( 时间戳 / 86400 ) + 25569 = Excel时间
或者反过来,从Excel到纪元时间戳:
( Excel时间 - 25569 ) * 86400 = 时间戳
(这些不包括时区调整,因此您可以根据需要add/subtract。)
更多信息:
维基百科:Unix Time & Digital Timestamps
奇普皮尔逊:Time Zones And Daylight Savings Time (Windows API)
堆栈溢出:Convert between arbitrary timezones(区域→区域)