从getSystemtime preciseasfiletime()到本地时间可靠的快速方式



winapi函数 GetSystemTimePreciseAsFileTime()将时间写入 FILETIME结构,而时间是UTC。我想用微秒和一百纳秒来获得当地时间。我希望该算法首先是可靠的,然后是快速。

问题是我到目前为止考虑的所有Winapi似乎都不可靠:

  1. FileTimeToLocalFileTime()似乎不可靠,因为其文档说

在将文件时间转换为一个 当地时间,使用以下函数序列代替使用 Filetimetolocalfiletime ...

  1. 但是,上述序列函数中建议的 SystemTimeToTzSpecificLocalTime()似乎也不可靠,因为其文档说:

SystemTimetotzSpecificalpificaltime函数可能会计算本地 在以下条件下的时间错误:

a(时区使用 新年和新年的UTC偏移不同。

b(UTC是 转换和计算出的当地时间在不同的年份。

案例A(似乎并不重要,但是,我绝对希望该算法在新年左右正常工作。

最后,我已经考虑了SystemTimeToTzSpecificLocalTimeEx(),但是,我尚不清楚它与SystemTimeToTzSpecificLocalTime()有何不同,并且其文档似乎不值得信赖:它说lpTimeZoneInformation参数是可选的,但并未说明如何指定指定默认值(是NULL?(,在该默认情况下该函数的表现如何(它会假定当前时区?(。

该算法的下一部分是提取子毫秒值,因为它们不是由SYSTEMTIME结构提供的。我可以在 uint64_t值中存储在 FILETIME结构中的 N%10000吗?

SystemTimeToTzSpecificLocalTimeSystemTimeToTzSpecificLocalTimeEx之间的差异是后者使用DYNAMIC_TIME_ZONE_INFORMATION结构,该结构可以正确反映Windows注册表中的所有年度全年信息。

TIME_ZONE_INFORMATION结构确实对时区信息的同比更改。它仅反映当前的活动规则。如果您要使用任意日期时间值,则应避免使用此结构,因为您不能保证当前规则是与您合作的日期时间的正确规则。

但是,如果您关心的只是当前时间,那么就不必担心自己的变化。即使您要在年初或年底接近时间,Windows也会在适当的时间更新当前时区规则。

此外,使用SystemTimeToTzSpecificLocalTimeSystemTimeToTzSpecificLocalTimeEx函数,时区参数是可选的。通过NULL将使用当前的本地时区。这是在SystemTimeToTzSpecificLocalTime上记录的:

如果lpTimeZoneNULL,则该函数使用当前活动时区。

SystemTimeToTzSpecificLocalTimeEx上的文档中缺少它,但效果相同。

因此,要获得当前的本地时间,OS可以提供所有可用的精确度,然后:

  1. GetSystemTimePreciseAsFileTime
  2. FileTimeToSystemTime
  3. SystemTimeToTzSpecificLocalTime(Ex不需要这里,然后留下tz null(
  4. SystemTimeToFileTime
  5. 从步骤1到步骤4的结果,通过子毫秒副本复制。

最新更新