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

Mar*_*ark 34 c++ windows

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

Hea*_*utt 51

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

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

要将a转换FILETIME ft_now;为64位整数ll_now,请使用以下命令:
ll_now = (LONGLONG)ft_now.dwLowDateTime + ((LONGLONG)(ft_now.dwHighDateTime) << 32LL);

然后,您可以在毫秒(10,000个)中除以100纳秒间隔的数量,并且自Win32纪元以来您有毫秒.

要转换为Unix纪元,请减去116444736000000000LL1970年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().

  • 互联网上的最佳答案 (3认同)
  • @MattPrice:你不能只是演员,请参阅https://msdn.microsoft.com/en-gb/library/windows/desktop/ms724284(v=vs.85).aspx:"不要指向一个指针FILETIME结构为ULARGE_INTEGER*或__int64*值,因为它可能导致64位Windows上的对齐错误" (3认同)
  • 深入细分为+1.小心地为NT5.1 +添加关于'至少在Windows NT 3.1,3.51和4.01时最快的用户-api'的位.这是否意味着不再是这种情况? (2认同)
  • 你也可以使用这样一个事实,即FILETIME的布局就像很长的一样,并且只是投射它.看看LARGE_INTEGER如何与联合一起工作,这是同样的想法.`*reinterpret_cast <long long*>(&ft_now)` (2认同)
  • 应该是"将文件时间(100纳秒)转换为Unix纪元,减去116444736000000000LL到1970年1月1日." 虽然 (2认同)

Jed*_*ith 40

要获得表示为UTC的时间,请GetSystemTime在Win32 API中使用.

SYSTEMTIME st;
GetSystemTime(&st);
Run Code Online (Sandbox Code Playgroud)

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

WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
Run Code Online (Sandbox Code Playgroud)

正如shf301在下面指出的那样,GetLocalTime(使用相同的原型)将产生一个纠正用户当前时区的时间.

你有几个好的答案,取决于你所追求的.如果你正在寻找的只是一天的时间,我的回答是最好的办法-如果你需要坚实的日期算法,考虑Alex的.有很多方法可以让 Windows上的时间变得更好,其中一些比其他人更准确(而且还没有人提到过QueryPerformanceCounter).

  • 使用GetLocalTime获取用户看到的时间和日期.http://msdn.microsoft.com/en-us/library/ms724338%28VS.85%29.aspx (5认同)
  • QueryPerformanceCounter ...我认为你可能在开玩笑,因为它有很多缺点会使它在这里选择不好. (2认同)

Ste*_*Cav 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); }
Run Code Online (Sandbox Code Playgroud)