在Windows中使用C ++进行高精度的日期和时间

时间:2018-11-29 07:34:08

标签: c++ windows datetime

我是Windows环境下C ++编程的新手。 我想以以下格式获取当前系统日期和时间: DD-MM-YYYY HH:MM:SS。使用Windows C ++ API的毫秒。我需要捕获的时间最多为微秒。您能否分享一个示例代码,了解如何在Windows中实现这一目标。

3 个答案:

答案 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;