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 时间,则不应涉及时区。操作系统会自动处理。直接使用GetSystemTimeGetSystemTimeAsFileTime 直接获取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 区域是不是也有效?的主要内容,如果未能解决你的问题,请参考以下文章

2020年十大返利app排行榜

顺丰同城开放平台返点吗

类的无参方法,注释

java反射

Servlet进行批量删除

JavaScript Math 对象