VBA当地时区调整

假设我有一个本地太平洋时间(UTC-8)Excel值。 例如41656.6729717 January 2014 4:09 PM 。 我无法控制这个值。

我想调整相对于用户当地时间的给定值。 比如说,都柏林的某个人正在使用Excel工作簿。 我想调整给定的数字,并在当地时间显示, 18 January 2014 12:09 AM 。 是否有任何内置的Excelfunction,使其顺利?

VBA本身不提供这个选项,但有一个Windows API,可以让你做你想要的。 本文介绍如何这样做, 这里是GetTimeZoneInformation上的MSDN页面。

从CPearson页面,首先做这些声明:

 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 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' NOTE: If you are using the Windows WinAPI Viewer Add-In to get ' function declarations, not that there is an error in the ' TIME_ZONE_INFORMATION structure. It defines StandardName and ' DaylightName As 32. This is fine if you have an Option Base ' directive to set the lower bound of arrays to 1. However, if ' your Option Base directive is set to 0 or you have no ' Option Base diretive, the code won't work. Instead, ' change the (32) to (0 To 31). '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 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 '''''''''''''''''''''''''''''''''''''''''''''' ' These give symbolic names to the time zone ' values returned by GetTimeZoneInformation . '''''''''''''''''''''''''''''''''''''''''''''' Private Enum TIME_ZONE TIME_ZONE_ID_INVALID = 0 ' Cannot determine DST TIME_ZONE_STANDARD = 1 ' Standard Time, not Daylight TIME_ZONE_DAYLIGHT = 2 ' Daylight Time, not Standard End Enum Private Declare Function GetTimeZoneInformation Lib "kernel32" _ (lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long Private Declare Sub GetSystemTime Lib "kernel32" _ (lpSystemTime As SYSTEMTIME) 

那么这个函数会find用户的本地时间和GMT的偏移量:

 Function LocalOffsetFromGMT(Optional AsHours As Boolean = False, _ Optional AdjustForDST As Boolean = False) As Double ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' LocalOffsetFromGMT ' This returns the amount of time in minutes (if AsHours is omitted or ' false) or hours (if AsHours is True) that should be *added* to the ' local time to get GMT. If AdjustForDST is missing or false, ' the unmodified difference is returned. (eg, Kansas City to London ' is 6 hours normally, 5 hours during DST. If AdjustForDST is False, ' the resultif 6 hours. If AdjustForDST is True, the result is 5 hours ' if DST is in effect.) ' Note that the return type of the function is a Double not a Long. This ' is to accomodate those few places in the world where the GMT offset ' is not an even hour, such as Newfoundland, Canada, where the offset is ' on a half-hour displacement. ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Dim TBias As Long Dim TZI As TIME_ZONE_INFORMATION Dim DST As TIME_ZONE DST = GetTimeZoneInformation(TZI) If DST = TIME_ZONE_DAYLIGHT Then If AdjustForDST = True Then TBias = TZI.Bias + TZI.DaylightBias Else TBias = TZI.Bias End If Else TBias = TZI.Bias End If If AsHours = True Then TBias = TBias / 60 End If LocalOffsetFromGMT = TBias End Function 

您可以使用以下代码testing代码:

 MsgBox (LocalOffsetFromGMT()) 

然后将这个偏移量添加到原始时间,您可以执行以下操作:

 OriginalTime + TIME(LocalOffsetFromGMT(True, True), 0, 0)