Получить текущую дату с точностью до миллисекунд

Мне нужно получить текущую дату UTC в формате для печати с точностью до миллисекунд в С ++ 11. Мне нужно, чтобы это работало в Windows и Linux, поэтому кроссплатформенный код предпочтительнее. Если это невозможно, я могу написать две отдельные реализации.

Вот что я пробовал:

std::chrono::time_point<std::chrono::high_resolution_clock> time = std::chrono::system_clock::now();
std::time_t tt = std::chrono::high_resolution_clock::to_time_t(time);

struct tm* utc = nullptr;
gmtime_s(utc, &tt);

char buffer[256];
std::strftime(buffer, sizeof(buffer), "%Y-%m-%dT-%H:%M:%S. %MILLESECONDS???, utc);

Хотя, как вы можете видеть, это НЕ сводится к миллисекундам. Я могу сам отформатировать строку, если мне нужно, до тех пор, пока я могу каким-то образом получить значение в миллисекундах.


person marsh    schedule 17.10.2016    source источник
comment
Вы не сможете получить миллисекунды от объекта std::tm - они не храните эту информацию   -  person jaggedSpire    schedule 17.10.2016
comment
github.com/HowardHinnant/date/wiki/ #research   -  person Lightness Races in Orbit    schedule 17.10.2016
comment
time_t будет обрабатывать только секунды, но каждое второе приращение может запускать поток счетчика, который будет считать до 1000 мс, используя std :: chrono, значение которого может быть напечатано в основном потоке.   -  person seccpur    schedule 17.10.2016
comment
@LightnessRacesinOrbit возвращает миллисекунды с полуночи? Или формат даты в миллисекундах. Мне все еще нужно проделать всю работу, чтобы преобразовать это в пригодную для использования дату с високосными годами и т. Д. Это можно сделать, но я надеялся не изобретать велосипед.   -  person marsh    schedule 17.10.2016
comment
@marsh: В чем разница? Какие еще миллисекунды вы бы использовали в метке даты? Получите дату и время как обычно, затем добавьте миллисекунды ...   -  person Lightness Races in Orbit    schedule 17.10.2016
comment
Я обновил свой ответ (stackoverflow.com/a/12844843/576911), чтобы конкретно ответить на этот вопрос.   -  person Howard Hinnant    schedule 17.10.2016
comment
@LightnessRacesinOrbit: один - это общее количество миллисекунд, а один - это оставшиеся миллисекунды, оставшиеся до следующей секунды.   -  person marsh    schedule 17.10.2016
comment
@marsh: Любой из них тривиально конвертируется в то, что вам нужно, с помощью базовой арифметики! Что мне не хватает?   -  person Lightness Races in Orbit    schedule 17.10.2016
comment
@LightnessRacesinOrbit Я думаю, что неправильно понимаю какой-то основной принцип, но для преобразования миллисекунд в действительную дату и время вам не нужно учитывать високосные годы, високосные секунды и т.д. напишите свой собственный временной класс.   -  person marsh    schedule 17.10.2016
comment
@marsh: не понимаю почему; миллисекунды не заботятся о том, какие дни или часы были пропущены или добавлены. Просто примените % 1000 и готово! Все, что для этого требуется, - это эпоха, которая составляет целое количество секунд (чтобы ваши миллисекунды не смещались), и я не знаю ни одной широко используемой эпохи, которая не находится на границе в одну секунду. Даже если вы использовали один, опять же простое сложение / вычитание вернет вас туда, где вам нужно быть.   -  person Lightness Races in Orbit    schedule 17.10.2016
comment
@LightnessRacesinOrbit Хорошо, теперь я понимаю. Вы правы, я могу получить дату и время в обычном режиме, а затем использовать его в миллисекундах. Спасибо.   -  person marsh    schedule 17.10.2016
comment
@marsh: Удачи!   -  person Lightness Races in Orbit    schedule 17.10.2016


Ответы (1)


time_t содержит только секунды, поэтому вы можете использовать функции std :: chrono для большей точности:

#include <iostream>
#include <chrono>

int main() 
{
    typedef std::chrono::system_clock clock_type;

    auto now = clock_type::now();
    auto seconds = std::chrono::time_point_cast<std::chrono::seconds>(now);
    auto fraction = now - seconds;
    time_t cnow = clock_type::to_time_t(now);

    auto milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(fraction);
    std::cout << "Milliseconds: " << milliseconds.count() << '\n';
}
person Evgeniy    schedule 17.10.2016