Обсудив в комментариях, что именно вам нужно, я придумал это:
size_t MkTimestamp(char *output, size_t size)
{
milliseconds ms = duration_cast<milliseconds>(system_clock::now().time_since_epoch());
seconds s = duration_cast<seconds>(ms);
time_t ctime = (time_t) s.count();
tm components;
size_t return_value = 0;
if (!localtime_r(&ctime, &components)) return 0;
if ((return_value = strftime(output, size, "%F %T:XXX", &components)) == 0) return 0;
int ms_d1 = ms.count() / 100 % 10, ms_d2 = ms.count() / 10 % 10, ms_d3 = ms.count() % 10;
output[return_value - 3] = ms_d1 + '0';
output[return_value - 2] = ms_d2 + '0';
output[return_value - 1] = ms_d3 + '0';
return return_value;
}
Короче говоря, вы даете ему символьный буфер и его размер, и он записывает в него метку времени (если буфер слишком мал, он возвращает ноль, в противном случае он возвращает общее количество записанных символов, включая завершающий нуль). Если вам нужна эта метка времени как std::string
, вы можете использовать конструктор среза std::string
:
char buffer[64];
string timestamp(buffer, MkTimestamp(buffer, sizeof buffer));
Строковый конструктор будет считывать до нулевого ограничителя, если MkTimestamp завершится успешно, и создаст пустую строку, если он завершится ошибкой. Возможно, вы могли бы объединить этот шаг в MkTimestamp
, если бы захотели.
Это отличается от вашей первой попытки следующим образом:
- Поскольку вы пытаетесь создать отметку времени, вам лучше использовать абсолютное, а не относительное время.
- Поскольку мы хотим использовать абсолютное время, мы должны использовать
system_clock
, потому что это единственные часы, которые на самом деле дают значения time_point
, которые можно осмысленно преобразовать в значения time_t
, которые будут принимать старые функции семейства C. (Иногда эти двое часов имеют одну и ту же эпоху или даже одни и те же часы. Но не всегда.)
- Я выбрал другой формат времени. Вы можете изменить это, если хотите, это не составит труда. Я настоятельно рекомендую вам оставить заполнители миллисекунд в строке формата, чтобы вам не нужно было выполнять какие-либо тесты длины, пока
strftime
завершается успешно.
Отметить, где следует отдать должное (другие ответы stackoverflow, на которые я ссылался при написании этого ответа)
Исходный ответ:
Вот ideone с вашим кодом. (Обратите внимание, что проблема, которую вы описываете, не возникает.) Кроме того, вы отсутствует #include <thread>
.
Кроме того, документация для ctime()
указывает, что его аргументом должна быть календарная дата. . Вы передаете ему интервал в одну секунду, что само по себе более или менее бессмысленно. Вы, вероятно, правы, что он показывает ровно один час из-за проблемы с интерпретацией часового пояса.
Я не могу ответить лучше без более подробной информации о том, что вы на самом деле пытаетесь сделать.
person
Wug
schedule
08.10.2014
ctime
, но документация кажется чтобы указать, что время преобразуется с использованиемlocaltime
. - person Retired Ninja   schedule 09.10.2014gmtime
или любую другую альтернативу. - person Retired Ninja   schedule 09.10.2014