Создайте удобочитаемую метку времени и сохраните ее в виде строки в C ++ - PullRequest
1 голос
/ 07 мая 2020

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

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 ++ с использованием стандартных библиотек?

1 Ответ

1 голос
/ 07 мая 2020

То, о чем вы просите, не определено. Ваша временная метка исходит от "устойчивых" часов , которые гарантируют монотонное c время, но не связаны со временем настенных часов и, следовательно, не могут быть преобразованы в удобочитаемую временную метку (подумайте, что произойдет, если вы настроите ваше системное время -1 мин, часы monotoni c нельзя так настроить!). Часы Monotoni c часто отсчитываются с момента запуска системы. Если вы хотите распечатать временные метки, вы, скорее всего, захотите использовать 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).

...