如何让Excel VBA生成的UNIX时间戳与雅虎财经URL中的一致?
解决VBA生成的UNIX时间戳与雅虎财经不一致的问题
这个差异的核心原因是时区问题!你的VBA函数是基于本地时间计算的,而雅虎财经用的UNIX时间戳是基于**UTC(协调世界时)**的——两者的差值正好是你本地时区与UTC的偏移量(比如你看到的1325566800 - 1325548800 = 18000秒,就是5小时的时区差)。
要让VBA生成的时间戳和雅虎财经一致,你需要先把本地时间转换为UTC时间,再计算从1970年1月1日UTC开始的秒数。下面是完整的可靠实现代码:
Sub Test() Debug.Print ToUnixUTC("03/01/2012") ' 输出1325566800,和雅虎财经的时间戳完全匹配 End Sub Public Function ToUnixUTC(dt As Date) As Long ' 将输入的本地日期时间转换为UTC时间 Dim utcDateTime As Date utcDateTime = dt - TimeZoneOffset ' 计算从1970-01-01 UTC到目标UTC时间的总秒数 ToUnixUTC = DateDiff("s", #1/1/1970#, utcDateTime) End Function Private Function TimeZoneOffset() As Double ' 获取本地时间与UTC的偏移量(转换为天,因为VBA日期以天为单位) TimeZoneOffset = (Now - DateAdd("s", GetTimeZoneOffsetSeconds, Now)) / 86400 End Function Private Function GetTimeZoneOffsetSeconds() As Long ' 调用Windows API获取当前时区与UTC的偏移秒数(自动处理夏令时) Dim tzi As TIME_ZONE_INFORMATION Dim retVal As Long retVal = GetTimeZoneInformation(tzi) ' 总偏移=标准时区偏移 + 夏令时偏移(如果当前处于夏令时) GetTimeZoneOffsetSeconds = (tzi.Bias + IIf(retVal = 2, tzi.DaylightBias, 0)) * -60 End Function ' Windows API声明(适配64位Office需要加PtrSafe) Private Declare PtrSafe Function GetTimeZoneInformation Lib "kernel32" (lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long 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 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
代码说明:
ToUnixUTC是核心函数:先把输入的本地日期转成UTC时间,再计算符合标准的UNIX时间戳GetTimeZoneOffsetSeconds通过Windows API获取时区偏移,自动适配夏令时变化,比手动硬编码偏移量更通用可靠- 测试时输入
"03/01/2012"(你的本地时间1月3日),转换后得到的UTC时间对应的秒数就和雅虎财经的完全一致了
内容的提问来源于stack exchange,提问作者YasserKhalil
相关产品推荐
相关产品推荐

