我有一个MS Access应用程序,用于两个不同的时区.差异是7个小时.我需要找到两个办公室都关闭的时间,这样我就可以关闭他们的数据库了,我可以做紧凑和修复并备份它们.
所以我不需要创建两个分离前端,我告诉密切数据库一个在晚上1000点而另一个在凌晨4点我知道我可以说在世界贸易组织上午00:30关闭数据库.但我不知道如何在Local中转换同一个.现在我关闭数据库的代码如下所示:
Private Sub Form_Timer()
Dim RunAtLocalTime As String
RunAtLocalTime = Format(Now(), "HH:MM:SS")
If RunAtLocalTime = ("00:00:00") Then
DoCmd.Quit
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
我想做这样的事情:
Private Sub Form_Timer()
Dim RunAtLocalTime As String
Dim UTCTIME As
'''RunAtLocalTime = Convert(UTCTIME)
RunAtLocalTime = Format(Now(), "HH:MM:SS")
If RunAtLocalTime = ("00:00:00") Then
DoCmd.Quit
End If
End Sub
Run Code Online (Sandbox Code Playgroud)

请注意您使用哪种方法进行时区转换,包括与UTC标准之间的转换.时区规则(包括夏令时的差异)开始时令人困惑,因为它们不仅因地区或国家而异,而且在某些情况下由州或县变化.
为了进一步混淆问题,规则不断发展,因此出于合乎逻辑的原因(如地球的剩余一半,希望,正在逐步消除夏令时),有时不那么合乎逻辑(国家领导人随心所欲地改变规则),以及其他时间沟通不当(案例研究:土耳其的2015年混乱).
即使是加拿大/美国在2007年也发生了重大变化,编码人员经常忘记这一点. 本网站(或本页!)计算错误的其他解决方案是某些情况或时间框架.
理想情况下,我们都使用相同的方法从同一个地方获取信息.未来和历史时区信息的权威被认为是由iana.org发布的tz数据库和相关代码

以下转换方法考虑了所有夏令时和时区差异,我通过冗长的分析和权威文档(如Unicode的公共区域设置数据存储库)努力确认.
我最小化了空间和效率,仅包括与我的目的相关的功能:UTC时间和本地时间之间的转换,以及Epoch †时间戳和当地时间之间的转换.这是Tim Hall 的代码改编版.
† Epoch Timestamp,也称为Unix时间,是自1970年1月1日以来的秒数,在许多API和其他编程资源中用作标准时间格式.更多信息,请访问epochconverter.com和维基百科.
我建议将它放在一个模块中.
Option Explicit
'UTC/Local Time Conversion
'Adapted from code by Tim Hall published at https://github.com/VBA-tools/VBA-UtcConverter
Option Explicit
'UTC/Local Time Conversion
'Adapted from code by Tim Hall published at github.com/VBA-tools/VBA-UtcConverter
'PUBLIC FUNCTIONS:
' - UTCtoLocal(utc_UtcDate As Date) As Date converts UTC datetimes to local
' - LocalToUTC(utc_LocalDate As Date) As Date converts local DateTime to UTC
' - TimestampToLocal(st As String) As Date converts epoch timestamp to Local Time
' - LocalToTimestamp(dt as date) as String converts Local Time to timestamp
'Accuracy confirmed for several variations of time zones & DST rules. (ashleedawg)
'===============================================================================
Private Type utc_SYSTEMTIME
utc_wYear As Integer: utc_wMonth As Integer: utc_wDayOfWeek As Integer: utc_wDay As Integer
utc_wHour As Integer: utc_wMinute As Integer: utc_wSecond As Integer: utc_wMilliseconds As Integer
End Type
Private Type utc_TIME_ZONE_INFORMATION
utc_Bias As Long: utc_StandardName(0 To 31) As Integer: utc_StandardDate As utc_SYSTEMTIME: utc_StandardBias As Long
utc_DaylightName(0 To 31) As Integer: utc_DaylightDate As utc_SYSTEMTIME: utc_DaylightBias As Long
End Type
'http://msdn.microsoft.com/library/windows/desktop/ms724421.aspx /ms724949.aspx /ms725485.aspx
Private Declare PtrSafe Function utc_GetTimeZoneInformation Lib "kernel32" Alias "GetTimeZoneInformation" _
(utc_lpTimeZoneInformation As utc_TIME_ZONE_INFORMATION) As Long
Private Declare PtrSafe Function utc_SystemTimeToTzSpecificLocalTime Lib "kernel32" Alias "SystemTimeToTzSpecificLocalTime" _
(utc_lpTimeZoneInformation As utc_TIME_ZONE_INFORMATION, utc_lpUniversalTime As utc_SYSTEMTIME, utc_lpLocalTime As utc_SYSTEMTIME) As Long
Private Declare PtrSafe Function utc_TzSpecificLocalTimeToSystemTime Lib "kernel32" Alias "TzSpecificLocalTimeToSystemTime" _
(utc_lpTimeZoneInformation As utc_TIME_ZONE_INFORMATION, utc_lpLocalTime As utc_SYSTEMTIME, utc_lpUniversalTime As utc_SYSTEMTIME) As Long
Private Function utc_DateToSystemTime(utc_Value As Date) As utc_SYSTEMTIME ' "Helper Function" for Public subs (below)
With utc_DateToSystemTime
.utc_wYear = Year(utc_Value): .utc_wMonth = Month(utc_Value): .utc_wDay = Day(utc_Value)
.utc_wHour = Hour(utc_Value): .utc_wMinute = Minute(utc_Value): .utc_wSecond = Second(utc_Value): .utc_wMilliseconds = 0
End With
End Function
Private Function utc_SystemTimeToDate(utc_Value As utc_SYSTEMTIME) As Date ' "Helper Function" for Public Functions (below)
utc_SystemTimeToDate = DateSerial(utc_Value.utc_wYear, utc_Value.utc_wMonth, utc_Value.utc_wDay) + _
TimeSerial(utc_Value.utc_wHour, utc_Value.utc_wMinute, utc_Value.utc_wSecond)
End Function
'===============================================================================
Public Function TimestampToLocal(st As String) As Date
TimestampToLocal = UTCtoLocal((Val(st) / 86400) + 25569)
End Function
Public Function LocalToTimestamp(dt As Date) As String
LocalToTimestamp = (LocalToUTC(dt) - 25569) * 86400
End Function
Public Function UTCtoLocal(utc_UtcDate As Date) As Date
On Error GoTo errorUTC
Dim utc_TimeZoneInfo As utc_TIME_ZONE_INFORMATION, utc_LocalDate As utc_SYSTEMTIME
utc_GetTimeZoneInformation utc_TimeZoneInfo
utc_SystemTimeToTzSpecificLocalTime utc_TimeZoneInfo, utc_DateToSystemTime(utc_UtcDate), utc_LocalDate
UTCtoLocal = utc_SystemTimeToDate(utc_LocalDate)
Exit Function
errorUTC:
Debug.Print "UTC parsing error: " & Err.Number & " - " & Err.Description: Stop
End Function
Public Function LocalToUTC(utc_LocalDate As Date) As Date
On Error GoTo errorUTC
Dim utc_TimeZoneInfo As utc_TIME_ZONE_INFORMATION, utc_UtcDate As utc_SYSTEMTIME
utc_GetTimeZoneInformation utc_TimeZoneInfo
utc_TzSpecificLocalTimeToSystemTime utc_TimeZoneInfo, utc_DateToSystemTime(utc_LocalDate), utc_UtcDate
LocalToUTC = utc_SystemTimeToDate(utc_UtcDate)
Exit Function
errorUTC:
Debug.Print "UTC conversion error: " & Err.Number & " - " & Err.Description: Stop
End Function
Run Code Online (Sandbox Code Playgroud)
我知道这似乎是一个非常多的代码,只是为了增加/减少几个小时,但我精心研究,希望找到一个可靠的更短/更简单的方法,保证在当前和历史时间准确,但是不成功.使用此方法所需的只是复制和粘贴.☺
Sub testTZC()
'(Note that "Local time" in these examples is Vancouver/Los Angeles)
MsgBox LocalToUTC("2004-04-04 01:00") 'returns: 2004-04-04 9:00:00 AM (not DST)
MsgBox LocalToUTC("2004-04-04 03:00") 'returns: 2004-04-04 10:00:00 AM (is DST)
MsgBox UTCtoLocal("2000-01-01 00:00") 'returns: 1999-12-31 4:00:00 PM
MsgBox TimestampToLocal("1234567890") 'returns: 2009-02-13 3:31:30 PM
MsgBox LocalToTimestamp("April 17, 2019 7:45:55 PM") 'returns: 1555555555
End Sub
Run Code Online (Sandbox Code Playgroud)
我发现以下功能:
这返回UTC时区偏移量:
Option Compare Database
Option Explicit
Private Declare Function GetTimeZoneInformation Lib "kernel32" (lpTimeZoneInformation As TimeZoneInfo) As Long
Private Type SystemTime
intYear As Integer
intMonth As Integer
intwDayOfWeek As Integer
intDay As Integer
intHour As Integer
intMinute As Integer
intSecond As Integer
intMilliseconds As Integer
End Type
Private Type TimeZoneInfo
lngBias As Long
intStandardName(32) As Integer
intStandardDate As SystemTime
intStandardBias As Long
intDaylightName(32) As Integer
intDaylightDate As SystemTime
intDaylightBias As Long
End Type
Public Function GetUTCOffset() As Date
Dim lngRet As Long
Dim udtTZI As TimeZoneInfo
lngRet = GetTimeZoneInformation(udtTZI)
GetUTCOffset = udtTZI.lngBias / 60 / 24
End Function
Run Code Online (Sandbox Code Playgroud)
来源:[此网站](编辑链接不再有效,已删除)
并将时间转换为格林尼治标准时间的时间:
Option Explicit
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(31) As Integer
StandardDate As SYSTEMTIME
StandardBias As Long
DaylightName(31) As Integer
DaylightDate As SYSTEMTIME
DaylightBias As Long
End Type
Private Declare Function GetTimeZoneInformation Lib "kernel32" (lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long
'Purpose : Converts local time to GMT.
'Inputs : dtLocalDate The local data time to return as GMT.
'Outputs : Returns the local time in GMT.
'Author : Andrew Baker
'Date : 13/11/2002 10:16
'Notes :
'Revisions :
Public Function ConvertLocalToGMT(dtLocalDate As Date) As Date
Dim lSecsDiff As Long
'Get the GMT time diff
lSecsDiff = GetLocalToGMTDifference()
'Return the time in GMT
ConvertLocalToGMT = DateAdd("s", -lSecsDiff, dtLocalDate)
End Function
'Purpose : Converts GMT time to local time.
'Inputs : dtLocalDate The GMT data time to return as local time.
'Outputs : Returns GMT as local time.
'Author : Andrew Baker
'Date : 13/11/2002 10:16
'Notes :
'Revisions :
Public Function ConvertGMTToLocal(gmtTime As Date) As Date
Dim Differerence As Long
Differerence = GetLocalToGMTDifference()
ConvertGMTToLocal = DateAdd("s", Differerence, gmtTime)
End Function
'Purpose : Returns the time lDiff between local and GMT (secs).
'Inputs : dtLocalDate The local data time to return as GMT.
'Outputs : Returns the local time in GMT.
'Author : Andrew Baker
'Date : 13/11/2002 10:16
'Notes : A positive number indicates your ahead of GMT.
'Revisions :
Public Function GetLocalToGMTDifference() As Long
Const TIME_ZONE_ID_INVALID& = &HFFFFFFFF
Const TIME_ZONE_ID_STANDARD& = 1
Const TIME_ZONE_ID_UNKNOWN& = 0
Const TIME_ZONE_ID_DAYLIGHT& = 2
Dim tTimeZoneInf As TIME_ZONE_INFORMATION
Dim lRet As Long
Dim lDiff As Long
'Get time zone info
lRet = GetTimeZoneInformation(tTimeZoneInf)
'Convert diff to secs
lDiff = -tTimeZoneInf.Bias * 60
GetLocalToGMTDifference = lDiff
'Check if we are in daylight saving time.
If lRet = TIME_ZONE_ID_DAYLIGHT& Then
'In daylight savings, apply the bias
If tTimeZoneInf.DaylightDate.wMonth <> 0 Then
'if tTimeZoneInf.DaylightDate.wMonth = 0 then the daylight
'saving time change doesn't occur
GetLocalToGMTDifference = lDiff - tTimeZoneInf.DaylightBias * 60
End If
End If
End Function
Run Code Online (Sandbox Code Playgroud)
资料来源:这个网站
我相信第二个也使用第一个。
我相信任何一种都可以满足您的需求。
将本地时间转换为UTC,反之亦然:
Private Declare PtrSafe Function GetTimeZoneInformation Lib "kernel32" (lpTimeZoneInformation As Any) As Long
Private Declare PtrSafe Function SystemTimeToTzSpecificLocalTime Lib "kernel32" (lpTimeZoneInformation As Any, lpUniversalTime As Any, lpLocalTime As Any) As Long
Private Declare PtrSafe Function TzSpecificLocalTimeToSystemTime Lib "kernel32" (lpTimeZoneInformation As Any, lpLocalTime As Any, lpUniversalTime As Any) As Long
Private Declare PtrSafe Function SystemTimeToVariantTime Lib "OleAut32" (lpSystemTime As Any, pvtime As Any) As Long
Private Declare PtrSafe Function VariantTimeToSystemTime Lib "OleAut32" (ByVal pvtime As Double, lpSystemTime As Any) As Long
Public Function LocalTimeToUtc(ByVal Value As Date) As Date
Dim tm(0 To 15) As Integer, tzi(0 To 171) As Byte
GetTimeZoneInformation tzi(0)
VariantTimeToSystemTime Value, tm(0)
TzSpecificLocalTimeToSystemTime tzi(0), tm(0), tm(8)
SystemTimeToVariantTime tm(8), LocalTimeToUtc
End Function
Public Function UtcToLocalTime(ByVal Value As Date) As Date
Dim tm(0 To 15) As Integer, tzi(0 To 171) As Byte
GetTimeZoneInformation tzi(0)
VariantTimeToSystemTime Value, tm(0)
SystemTimeToTzSpecificLocalTime tzi(0), tm(0), tm(8)
SystemTimeToVariantTime tm(8), UtcToLocalTime
End Function
Public Function LocalTimeToUnixTime(ByVal Value As Date) As Double
LocalTimeToUnixTime = (LocalTimeToUtc(Value) - 25569) * 86400
End Function
Public Function UnixTimeToLocalTime(ByVal Value As Double) As Date
UnixTimeToLocalTime = UtcToLocalTime(Value / 86400 + 25569)
End Function
Run Code Online (Sandbox Code Playgroud)