我是Windows环境下C ++编程的新手。 我想以以下格式获取当前系统日期和时间: DD-MM-YYYY HH:MM:SS。使用Windows C ++ API的毫秒。我需要捕获的时间最多为微秒。您能否分享一个示例代码,了解如何在Windows中实现这一目标。
答案 0 :(得分:2)
使用C ++ 20规范草案:
#include <chrono>
#include <iostream>
int
main()
{
using namespace std;
using namespace std::chrono;
cout << format("%d-%m-%Y %T", floor<microseconds>(system_clock::now())) << '\n';
}
当前VS尚未实现此功能,但是您可以使用Howard Hinnant's date/time library获得预览。只需添加它并添加一个using指令即可:
#include "date/date.h"
#include <chrono>
#include <iostream>
int
main()
{
using namespace date;
using namespace std;
using namespace std::chrono;
cout << format("%d-%m-%Y %T", floor<microseconds>(system_clock::now())) << '\n';
}
当您要求“系统时间”时,它会传递一个UTC时间戳,因为这就是您的系统时间所衡量的。如果您想使用当地时间,也可以使用,但是requires some installation。
示例输出:
29-11-2018 14:45:03.679098
答案 1 :(得分:0)
我建议使用std::chrono库。看这个例子:
15
还有可能获得微秒:
#include <chrono>
#include <ctime>
#include <sstream>
#include <iomanip>
#include <string>
std::string current_datetime()
{
using namespace std::chrono;
// get current time
auto now = high_resolution_clock::now();
// get duration in milliseconds
auto msec = duration_cast<milliseconds>(now.time_since_epoch()).count();
msec %= 1000;
// get printable result:
auto now_time_t = high_resolution_clock::to_time_t(now);
std::stringstream ss;
ss << std::put_time(std::gmtime(&now_time_t), "%d-%m-%Y %X:") << msec;
return ss.str();
}
int main()
{
for(auto i = 0U;i < 1000;i++)
std::cout << current_datetime() << std::endl;
}
如果您需要特定于WinAPI的版本:
auto mksec = duration_cast<microseconds>(now.time_since_epoch()).count();
mksec %= 1000;
或另一个非常简单的WinAPI版本,但没有微秒:
std::string current_datetime2()
{
FILETIME ft;
GetSystemTimeAsFileTime(&ft);
unsigned long long mks = static_cast<unsigned long long>(ft.dwHighDateTime) << 32 | ft.dwLowDateTime;
mks /= 10; // interval in microsecond
mks %= 1000;
SYSTEMTIME st;
FileTimeToSystemTime(&ft, &st);
std::stringstream ss;
ss << st.wDay << "-" << st.wMonth << "-" << st.wYear << " " <<
st.wHour << ":" << st.wMinute << ":" << st.wSecond << ":" << st.wMilliseconds << ":" << mks << std::endl;
return ss.str();
}
答案 2 :(得分:-1)
在Windows平台上:
_
将满足大多数情况。如果您想获得更准确的时间跨度,请使用
QueryPerformanceFrequency, QueryPerformanceCounter;