GetTimeZoneInformation的返回值是否也对动态DST区域有效?

时间:2014-06-02 07:38:04

标签: winapi timezone utc dst

我在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(对成员的定义不完整"偏见"顺便说一句),我不清楚如果简单地调用GetTimeZoneInformation就足以让我的函数{{1也适用于具有动态DST设置的区域(即DST日期每年变化)。换句话说,CurrentUnixTimeUTC可以成功判断系统当前是否处于DST模式,或者我是否需要调用GetTimeZoneInformation,如果我想与时区中的计算机兼容应用动态DST规则的地方?

1 个答案:

答案 0 :(得分:3)

如果您只想从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;