【问题标题】:Converting local time to time stamp将本地时间转换为时间戳
【发布时间】:2016-01-14 16:03:00
【问题描述】:

如何将 GetLocalTime 返回的 SYSTEMTIME 结构转换为时间戳(自 1970 年以来的秒数,ULONG)?

【问题讨论】:

  • 仅供参考:ISO 有一个时间戳标准ISO 8601

标签: c winapi


【解决方案1】:

一种方法是将参考时间和目标时间都转换为FILETIME 结构,然后您可以对它们的值执行简单的算术运算。这些以 100ns 为单位测量,因此您需要将最终结果除以 10000000 以获得秒数。

// reference time, convert to FILETIME
SYSTEMTIME stRef{};
stRef.wYear = 1970;
stRef.wMonth = 1;
stRef.wDay = 1;

FILETIME ftRef;
SystemTimeToFileTime(&stRef, &ftRef);


// target time, convert to FILETIME
SYSTEMTIME stTarget;
GetLocalTime(&stTarget);

FILETIME ftTarget;
SystemTimeToFileTime(&stTarget, &ftTarget);


// convert both to ULARGE_INTEGER
ULARGE_INTEGER ulRef, ulTarget;
ulRef.HighPart = ftRef.dwHighDateTime;
ulRef.LowPart = ftRef.dwLowDateTime;
ulTarget.HighPart = ftTarget.dwHighDateTime;
ulTarget.LowPart = ftTarget.dwLowDateTime;


// subtract reference time from target time
ulTarget.QuadPart -= ulRef.QuadPart;

// convert to seconds (divide by 10000000)
DWORD dwSecondsSinceRefTime = ulTarget.QuadPart / 10000000i64;

【讨论】:

  • 不应该是GetSystemTime而不是GetLocalTime吗?即使我们在不同的时区,我们现在也应该看到相同的时间戳。
  • @BarmakShemirani 这就是 OP 所要求的,您当然可以在那里使用任何时间戳。方法很重要。
  • 我不知道在 OP 的问题中我是如何错过 GetLocalTime 的。可能是痴呆症的早期阶段。
猜你喜欢
  • 2019-08-15
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 2019-01-05
  • 2013-03-23
  • 1970-01-01
  • 2020-06-13
  • 2018-09-17
相关资源
最近更新 更多