Дата и время с высокой точностью в Windows, используя C ++ - PullRequest
0 голосов
/ 29 ноября 2018

Я новичок в программировании на C ++ в среде Windows.Я хочу получить текущую системную дату и время в следующем формате: ДД-ММ-ГГГГ ЧЧ: ММ: СС. Миллисекунды с использованием Windows C ++ API. Мне нужно захватить до микросекунд.Не могли бы вы поделиться примером кода о том, как добиться этого в Windows.

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

Рекомендую использовать библиотеку std :: chrono .Посмотрите на этот пример:

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

Также можно получить микросекунды:

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

илиеще одна очень простая WinAPI-версия, но без микросекунд:

std::string current_datetime3()
{
    SYSTEMTIME st;
    GetSystemTime(&st);
    std::stringstream ss;
    ss << st.wDay << "-" << st.wMonth << "-" << st.wYear << " " <<
        st.wHour << ":" << st.wMinute << ":" << st.wSecond << ":" << st.wMilliseconds;
    return ss.str();
}
0 голосов
/ 29 ноября 2018

Использование черновика спецификации 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 не реализует это, но вы можете получить предварительный просмотр с помощью библиотеки дат / времени Говарда Хиннанта .Просто включите его и добавьте директиву 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, поскольку именно это измеряет ваше системное время.Если вместо этого вам нужно местное время, оно также доступно, но требует некоторой установки .

Пример вывода:

29-11-2018 14:45:03.679098
0 голосов
/ 29 ноября 2018

на платформе Windows:

SYSTEMTIME st;
GetLocalTime(&st);
TCHAR buf[128];
_stprintf_s(buf, _ARRAYSIZE(buf),
    _T("%04u-%02u%-%02u %02u:%02u:%02u.%03u"),
    st.wYear, st.wMonth, st.wDay,
    st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);

удовлетворит большинство случаев.Если вы хотите получить более точный временной интервал, используйте

QueryPerformanceFrequency, QueryPerformanceCounter;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...