winapi函数 GetSystemTimePreciseAsFileTime()
将时间写入 FILETIME
结构,而时间是UTC。我想用微秒和一百纳秒来获得当地时间。我希望该算法首先是可靠的,然后是快速。
问题是我到目前为止考虑的所有Winapi似乎都不可靠:
-
FileTimeToLocalFileTime()
似乎不可靠,因为其文档说
在将文件时间转换为一个 当地时间,使用以下函数序列代替使用 Filetimetolocalfiletime ...
- 但是,上述序列函数中建议的
SystemTimeToTzSpecificLocalTime()
似乎也不可靠,因为其文档说:
SystemTimetotzSpecificalpificaltime函数可能会计算本地 在以下条件下的时间错误:
a(时区使用 新年和新年的UTC偏移不同。
b(UTC是 转换和计算出的当地时间在不同的年份。
案例A(似乎并不重要,但是,我绝对希望该算法在新年左右正常工作。
最后,我已经考虑了SystemTimeToTzSpecificLocalTimeEx()
,但是,我尚不清楚它与SystemTimeToTzSpecificLocalTime()
有何不同,并且其文档似乎不值得信赖:它说lpTimeZoneInformation
参数是可选的,但并未说明如何指定指定默认值(是NULL
?(,在该默认情况下该函数的表现如何(它会假定当前时区?(。
该算法的下一部分是提取子毫秒值,因为它们不是由SYSTEMTIME
结构提供的。我可以在 uint64_t
值中存储在 FILETIME
结构中的 N%10000
吗?
SystemTimeToTzSpecificLocalTime
和SystemTimeToTzSpecificLocalTimeEx
之间的差异是后者使用DYNAMIC_TIME_ZONE_INFORMATION
结构,该结构可以正确反映Windows注册表中的所有年度全年信息。
TIME_ZONE_INFORMATION
结构确实对时区信息的同比更改。它仅反映当前的活动规则。如果您要使用任意日期时间值,则应避免使用此结构,因为您不能保证当前规则是与您合作的日期时间的正确规则。
但是,如果您关心的只是当前时间,那么就不必担心自己的变化。即使您要在年初或年底接近时间,Windows也会在适当的时间更新当前时区规则。
此外,使用SystemTimeToTzSpecificLocalTime
和SystemTimeToTzSpecificLocalTimeEx
函数,时区参数是可选的。通过NULL
将使用当前的本地时区。这是在SystemTimeToTzSpecificLocalTime
上记录的:
如果
lpTimeZone
是NULL
,则该函数使用当前活动时区。
SystemTimeToTzSpecificLocalTimeEx
上的文档中缺少它,但效果相同。
因此,要获得当前的本地时间,OS可以提供所有可用的精确度,然后:
-
GetSystemTimePreciseAsFileTime
-
FileTimeToSystemTime
-
SystemTimeToTzSpecificLocalTime
(Ex
不需要这里,然后留下tz null( -
SystemTimeToFileTime
- 从步骤1到步骤4的结果,通过子毫秒副本复制。