我在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规则的地方?
答案 0 :(得分:3)
如果您只想从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;