2015-10-16 233 views
1

将由GetLocalTime返回的SYSTEMTIME结构转换为时间戳(自1970年以来的秒数ULONG)会怎样?将本地时间转换为时间戳

+1

供参考:ISO具有时间戳标准[ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) – chux

回答

2

一种方法是将参考时间和目标时间都转换为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; 
+0

不是应该的'GetSystemTime'代替'GetLocalTime'?即使我们处于不同的时区,我们现在也应该看到相同的时间戳。 –

+0

@BarmakShemirani这就是OP所要求的,当然你可以使用任何时间戳。这是重要的方法。 –

+0

我不知道我在OP的问题中错过了GetLocalTime。也许早期的痴呆症。 –