将当前时间从Windows转换为使用C或C ++的unix时间戳

时间:2013-12-04 08:58:13

标签: c++ c windows unix time

首先,我知道这个问题已被问过很多次了(虽然看起来有90%是关于转换Unix ts - > Windows)。 其次,我会在另一个被接受的问题上添加评论,我的问题不适合添加另一个,但我没有足够的声誉。

我在Convert Windows Filetime to second in Unix/Linux中看到了已接受的解决方案,但我仍然坚持应该传递给函数 WindowsTickToUnixSeconds 。根据参数名称​​ windowsTicks 判断我尝试了GetTickCount但不久之后看到这会返回ms ,因为系统启动但是我需要任何合理的计数,因为开始Windows时间(似乎是在1601年?)。

我看到Windows有一个检索这个时间的功能:GetSystemTime。我无法将结果结构传递给1中的建议函数,因为它不是很长的值。

请不要有人为C或C ++提供一个完整的工作示例,而不会忽略这些疯狂的细节?

3 个答案:

答案 0 :(得分:3)

对于Windows上的人:

Int64 GetSystemTimeAsUnixTime()
{
   //Get the number of seconds since January 1, 1970 12:00am UTC
   //Code released into public domain; no attribution required.

   const Int64 UNIX_TIME_START = 0x019DB1DED53E8000; //January 1, 1970 (start of Unix epoch) in "ticks"
   const Int64 TICKS_PER_SECOND = 10000000; //a tick is 100ns

   FILETIME ft;
   GetSystemTimeAsFileTime(out ft); //returns ticks in UTC

   //Copy the low and high parts of FILETIME into a LARGE_INTEGER
   //This is so we can access the full 64-bits as an Int64 without causing an alignment fault
   LARGE_INTEGER li;
   li.LowPart  = ft.dwLowDateTime;
   li.HighPart = ft.dwHighDateTime;

   //Convert ticks since 1/1/1970 into seconds
   return (li.QuadPart - UNIX_TIME_START) / TICKS_PER_SECOND;
}

该函数的名称与其他Windows函数使用的命名方案相匹配。 Windows 系统时间按照定义 UTC。

| Function                | Return type       | Resolution  |
|-------------------------|-------------------|-------------|
| GetSystemTimeAsFileTime | FILETIME struct   | 0.0000001 s |
| GetSystemTime           | SYSTEMTIME struct | 0.001 s     |
| GetSystemTimeAsUnixTime | Int64             | 1 s         |

答案 1 :(得分:2)

也许我的问题表达得很糟糕:我想要的只是将当前时间作为unix时间戳记在Windows机器上。 我现在想出来了(C语言,Code :: Blocks 12.11,Windows 7 64 bit):

#include <stdio.h>
#include <time.h>
int main(int argc, char** argv) {
    time_t ltime;
    time(&ltime);
    printf("Current local time as unix timestamp: %li\n", ltime);

    struct tm* timeinfo = gmtime(&ltime); /* Convert to UTC */
    ltime = mktime(timeinfo); /* Store as unix timestamp */
    printf("Current UTC time as unix timestamp: %li\n", ltime);

    return 0;
}

示例输出:

Current local time as unix timestamp: 1386334692
Current UTC time as unix timestamp: 1386331092

答案 2 :(得分:1)

通过SYSTEMTIME设置GetSystemTime结构,可以轻松创建aa struct tm(请参阅asctime以获取结构参考)并将其转换为“UNIX”时间戳“使用mktime功能。