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

时间:2009-11-08 03:32:14

标签: c++ windows

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

6 个答案:

答案 0 :(得分:48)

最简单(也是最直接)的方法是调用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()

答案 1 :(得分:40)

要获得以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(使用相同的原型)将产生一个纠正用户当前时区的时间。

这里有一些好的答案,取决于你所追求的。如果您正在寻找只是时间,我的答案是最好的方法 - 如果您需要可靠的算术日期,请考虑Alex的。 Windows上有a lot of ways to skin the time cat,其中一些比其他更准确(还没有人提到QueryPerformanceCounter)。

答案 2 :(得分:7)

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); }

答案 3 :(得分:3)

首先使用GetSystemTime;然后,如果您需要,可以在前者为您填充的SYSTEMTIME结构上调用SystemTimeToFileTimeFILETIME是一个64位的100纳秒间隔,因为一个纪元,所以更适合算术; SYSTEMTIME是一个包含所有预期字段的结构(年,月,日,小时等,直到毫秒)。如果你想知道“自午夜以来经过了多少毫秒”,例如,减去两个FILETIME结构(一个用于当前时间,一个通过在清零相应的字段后转换相同的SYSTEMTIME获得的结构并且除以10的适当幂可能是最简单的方法。

答案 4 :(得分:2)

根据您的应用需求,有六种常见选项。这个Dr Dobbs Journal article将为您提供选择最佳信息所需的所有信息(以及更多信息)。

在您的具体案例中,请参阅本文:

  

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

答案 5 :(得分:1)

以下是一些适用于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
}