从Windows中的系统时钟获取当前时间(以毫秒为单位)?

如何在C ++中获取系统时钟的当前时间(以毫秒为单位)? 这是一个特定于Windows的应用程序。

要获取以UTC表示的时间,请在Win32 API中使用GetSystemTime

 SYSTEMTIME st; GetSystemTime(&st); 

SYSTEMTIME被记录为具有这些相关成员:

 WORD wYear; WORD wMonth; WORD wDayOfWeek; WORD wDay; WORD wHour; WORD wMinute; WORD wSecond; WORD wMilliseconds; 

正如shf301在下面帮助指出的, GetLocalTime (具有相同的原型)将产生纠正到用户当前时区的时间。

你在这里有几个很好的答案,取决于你在做什么。 如果你正在寻找一天的时间,我的答案是最好的方法 – 如果你需要固定的算术日期,考虑亚历克斯的。 有很多方法来清除 Windows上的时间猫 ,其中一些比其他人更准确(没有人提到过QueryPerformanceCounter )。

最简单的(也是最直接的)方法是调用GetSystemTimeAsFileTime() ,它返回一个FILETIME ,一个存储自1601年1月1日午夜以来的64位数的100纳秒间隔的结构。

至少在Windows NT 3.1,3.51和4.01时, GetSystemTimeAsFileTime() API是能够检索当前时间的最快的用户模式API。 它还提供了作为单个API调用的优点(与GetSystemTime() – > SystemTimeToFileTime())相比,在正常情况下不会失败。

转换FILETIME ft_now; 到名为ll_now的64位整数,请使用以下内容:
ll_now = (LONGLONG)ft_now.dwLowDateTime + ((LONGLONG)(ft_now.dwHighDateTime) << 32LL);

然后,您可以在一毫秒内(10,000个)除以100纳秒的间隔数,并且自Win32时代以来就有毫秒。

要转换为Unix纪元,减去116444736000000000LL到1970年1月1日。

你提到了一个想要找到当天毫秒数的愿望。 因为Win32时代在午夜开始,所以今天迄今为止通过的毫秒数可以通过模数运算从文件时间计算出来。 具体来说,因为有24 hours/day * 60 minutes/hour * 60 seconds/minute * 1000 milliseconds/second = 86,400,000 milliseconds/day ,您可以使用系统时间的模数以毫秒为单位的模数86400000LL

对于不同的应用程序,可能不想使用模数。 特别是在计算经过时间时,由于在午夜环绕,可能会有困难。 这些困难是可以解决的,我知道的最好的例子是Linus Torvald在Linux内核中处理计数器回绕的行。

请记住,系统时间是以UTC时间( GetSystemTimeAsFileTime()GetSystemTime() )的形式返回的。 如果您需要管理员配置的本地时间,那么您可以使用GetLocalTime()

根据您的应用程序的需要,有六个常见的选项。 这Dobbs杂志文章将给你所有的信息(和更多),你需要选择最好的一个。

在你的具体情况下,从这篇文章:

GetSystemTime()检索当前系统时间并实例化SYSTEMTIME结构,该结构由多个单独的字段(包括年,月,日,时,分,秒和毫秒)组成。

首先使用GetSystemTime ; 那么,如果你需要的话,你可以在前者为你填充的SYSTEMTIME结构上调用SystemTimeToFileTime 。 一个FILETIME是一个100-nanosecs间隔的64位计数,从一个纪元开始,所以更适合算术; 一个SYSTEMTIME是一个包含所有预期字段(年,月,日,小时等,下至毫秒)的结构。 如果你想知道“从午夜开始已经过了多少毫秒”,例如,减去两个FILETIME结构(当前时间之一,通过在清零相应的字段之后转换相同的SYSTEMTIME获得的),并且除以适当的功率十个可能是最简单的可用方法。

Jed上面的答案的一个切入的例子:

 const std::string currentDateTime() { SYSTEMTIME st, lt; GetSystemTime(&st); char currentTime[84] = ""; sprintf(currentTime,"%d/%d/%d %d:%d:%d %d",st.wDay,st.wMonth,st.wYear, st.wHour, st.wMinute, st.wSecond , st.wMilliseconds); return string(currentTime); } 

下面是一些在Windows中使用的代码,这些代码在Open Watcom C项目中使用过。 它应该在C ++中工作它使用_dos_gettime或gettime返回秒(而不是毫秒)

  double seconds(void) { #ifdef __WATCOMC__ struct dostime_t t; _dos_gettime(&t); return ((double)t.hour * 3600 + (double)t.minute * 60 + (double)t.second + (double)t.hsecond * 0.01); #else struct time t; gettime(&t); return ((double)t.ti_hour * 3600 + (double)t.ti_min * 60 + (double)t.ti_sec + (double)t.ti_hund * 0.01); #endif }