GetTimeZoneInformation 的返回值对动态 DST 区域是不是也有效?
Posted
技术标签:
【中文标题】GetTimeZoneInformation 的返回值对动态 DST 区域是不是也有效?【英文标题】:Is return value of GetTimeZoneInformation also valid for dynamic DST zones?GetTimeZoneInformation 的返回值对动态 DST 区域是否也有效? 【发布时间】:2014-07-22 06:34:03 【问题描述】:我在 Delphi 中编写的以下函数(但是,我的问题并非特定于 Delphi)输出当前的 UTC unix 时间戳:
function CurrentUnixTimeUTC: int64;
var
tzi: TTimeZoneInformation;
begin
// Get the current unix timestamp in local time.
Result := DateTimeToUnix(Now);
// First, add the DST specific bias
case GetTimeZoneInformation(tzi) of
TIME_ZONE_ID_INVALID:
RaiseLastOSError;
TIME_ZONE_ID_UNKNOWN:
; // Unknown what to do. We simply don't apply any bias.
TIME_ZONE_ID_STANDARD:
Result := Result + tzi.StandardBias * 60;
TIME_ZONE_ID_DAYLIGHT:
Result := Result + tzi.DaylightBias * 60;
end;
// Now apply the region specific bias
Result := Result + tzi.Bias * 60;
end;
该函数在德国有效,并且在加利福尼亚具有相同的输出。
在研究MSDN时,我还发现了GetDynamicTimeZoneInformation
这个函数。
通过阅读 MSDN(其中对成员“Bias”btw 的定义不完整),我不清楚简单地调用 GetTimeZoneInformation
是否足以让我的函数 CurrentUnixTimeUTC
也适用于具有动态的区域DST 设置(即 DST 日期每年都在变化)。换句话说,GetTimeZoneInformation
能否成功判断系统当前是否处于 DST 模式,或者如果我想与处于动态 DST 规则的时区的计算机兼容,我是否需要调用 GetDynamicTimeZoneInformation
应用了吗?
【问题讨论】:
【参考方案1】:如果您只是想从 Win32 API 获取当前 UTC 时间,则不应涉及时区。操作系统会自动处理。直接使用GetSystemTime
或GetSystemTimeAsFileTime
直接获取UTC 时间会更快。
例如,在 .NET 中,DateTime.UtcNow
只是调用GetSystemTimeAsFileTime
。但是DateTime.Now
首先调用DateTime.UtcNow
然后获取本地时区并将其应用于该时间。
关于您最初询问的动态 DST 信息,我相信调用 GetTimeZoneInformation
就足够了,因为 Windows 应该将适用于当前日期和时间的动态 DST 规则复制到非动态值中在注册表中。但就像我说的,最好直接获取 UTC 时间。
我很惊讶没有直接获取 UTC 时间的 Delphi 函数。它一定是一个时代的产物,因为在 Delphi 被广泛使用的时候,很多事情都是在本地完成的。
几个 Delphi 函数:
function NowUTC: TDateTime;
var
st: TSystemTime;
begin
GetSystemTime(st);
result := EncodeDateTime(st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
end;
function CurrentUnixUTCTimestamp: int64;
begin
result := DateTimeToUnix(NowUTC);
end;
【讨论】:
+1。我相信调用GetDynamicTimeZoneInformation
而不是GetTimeZoneInformation
的唯一原因是如果您想阅读TimeZoneKeyName
和/或DynamicDaylightTimeDisabled
。
非常感谢您的回答。我不知道 API GetSystemTime
- 这是一个很棒的功能。 :-) 顺便说一句,我在你的帖子中修正了一个错字。由于错字太小,我添加了我的 Delphi 代码。以上是关于GetTimeZoneInformation 的返回值对动态 DST 区域是不是也有效?的主要内容,如果未能解决你的问题,请参考以下文章