Создайте удобочитаемую метку времени и сохраните ее в виде строки в C ++

Я хотел бы создать имена файлов с отметками времени в них в зависимости от того, когда была запущена программа, т.е.

logfile_2020-04-21_18:11:10.txt
logfile_2020-04-22_18:13:43.txt
...

Я могу получить метку времени (я думаю) с помощью

std::chrono::steady_clock::time_point timestamp = std::chrono::steady_clock::now();

но я не знаю, как преобразовать это в строку, а тем более в удобочитаемую строку.

Точный формат меток времени не имеет значения, если в нем указаны полная дата и время. Есть ли простой способ сделать это в C ++ с использованием стандартных библиотек?


person MountainDrew    schedule 06.05.2020    source источник
comment
Есть несколько примеров по этому вопросу: они просто используют std::localtime ( или, возможно, std::gmtime для метки времени?), а затем strptime или std :: put_time.   -  person Rup    schedule 07.05.2020
comment
Возможный дубликат stackoverflow.com/questions/31281293/   -  person Galik    schedule 07.05.2020


Ответы (1)


То, о чем вы просите, не определено. Ваша временная метка исходит от "постоянных" часов , что гарантирует монотонное время, но не связано со стеной. время на часах и, следовательно, не может быть преобразовано в удобочитаемую метку времени (подумайте, что произойдет, если вы измените системное время на -1 мин, монотонные часы никогда не могут быть настроены таким образом!). Монотонные часы часто отсчитывают от запуска системы. Если вы хотите распечатать временные метки, вы, скорее всего, захотите использовать std::chrono::system_clock - например вот так:

#include <iostream>
#include <chrono>
#include <iomanip>

int main() {
  auto timestamp = std::chrono::system_clock::now();

  std::time_t now_tt = std::chrono::system_clock::to_time_t(timestamp);
  std::tm tm = *std::localtime(&now_tt);

  std::cout << std::put_time(&tm, "%c %Z") << '\n';
  return 0;
}

Дополнительную информацию о форматировании даты / времени можно найти в std::put_time() документации .

Предупреждение: std::localtime может быть небезопасным для потоков! Проверьте документацию к своей стандартной библиотеке, если вы собираетесь использовать ее в многопоточном контексте. Иногда также предоставляется реентерабельная версия (часто называемая localtime_r).

person Martin Konrad    schedule 06.05.2020
comment
Отлично, и спасибо за ссылку на put_time (). Я искал формат std :: put_time (& tm,% Y-% m-% d_% H:% M:% S). - person MountainDrew; 07.05.2020