Получить время с миллисекундами в С++ 17?

Как я могу получить текущее время в миллисекундах на С++ 17 с помощью boost или стандартной библиотеки? Я попытался использовать std::chrono:

int main()
{
    const auto currentDateTime = std::chrono::system_clock::now();
    const auto currentDateTimeTimeT = std::chrono::system_clock::to_time_t(currentDateTime);
    const auto currentDateTimeLocalTime = *std::gmtime(&currentDateTimeTimeT);

    char currentDateTimeArrStr[100];
    std::strftime(currentDateTimeArrStr, 100, "%Y%m%d_%H%M%S.%f", &currentDateTimeLocalTime);

    std::clog << std::string(currentDateTimeArrStr) << std::endl;
}

Но формат %f реализован только в функции strftime python не в C++, а с повышением:

int main()
{
    const auto date = boost::gregorian::day_clock::universal_day();
    boost::gregorian::date d(date.year(), date.month(), date.day());
    const auto time = boost::posix_time::second_clock::universal_time().time_of_day();
    boost::posix_time::time_duration td(time.hours(), time.minutes(), time.seconds(), time.fractional_seconds());
    std::stringstream ss;
    ss << d << ' ' << td;
    boost::posix_time::ptime pt(not_a_date_time);
    ss >> pt;
    std::cout << pt << std::endl;
}

Но буст API дает только total_milliseconds.

Мне нужен такой вывод: 12:02:34.323232


person Kate    schedule 22.07.2020    source источник
comment
Вы говорите, что вам нужен вывод вроде 12:02:34.323232. Конечно, это означает, что вам нужно время в микросекундах (чтобы иметь 6 знаков после запятой - миллисекунды будут только 3 знаками после запятой).   -  person Paul Floyd    schedule 22.07.2020


Ответы (1)


Так что просто напечатайте миллисекунды с момента времени...

const auto ms = std::chrono::time_point_cast<std::chrono::milliseconds>(currentDateTime).time_since_epoch().count() % 1000;
std::clog << std::put_time(&currentDateTimeLocalTime, "%Y%m%d_%H%M%S") 
    << "." << std::setfill('0') << std::setw(3) << ms << std::endl;

Как я могу получить текущее время с помощью миллисекунды в С++ 11

У вас уже есть текущее время на std::chrono::system_clock::now() звонке.

person KamilCuk    schedule 22.07.2020
comment
Спасибо, но мне нужна точность в 5 миллисекунд. - person Kate; 22.07.2020
comment
Это не миллисекунда :D И точность не разрешение, для точности попросите вашего системного дистрибьютора дать вам больше точности, т.е. найти более точный источник часов. 5-значное значение в миллисекундах, т. е. 10000 ms будет равно 10 секундам. - person KamilCuk; 22.07.2020
comment
Если вы хотите, чтобы выход имел разрешение в 10 микросекунд, просто преобразуйте момент времени в микросекунды, разделите результат на 10 и получите по модулю 10000. - person KamilCuk; 22.07.2020
comment
Благодаря преобразованию в микросекунды и наносекунды я думаю, что получаю то, что хочу, но, например, с помощью этого скрипта Python datetime.utcnow().strftime("%Y%m%d_%H%M%s.%f") я получаю вывод, подобный '20200722_12011595433689.367198', что мне и нужно в C++. - person Kate; 22.07.2020
comment
Но %f не поддерживается в C++. Итак... что ж... Я думаю, вы можете написать свою собственную реализацию strftime, которая будет поддерживать. - person KamilCuk; 22.07.2020