Как использовать std :: chrono для возвращения даты и времени в виде строки на C ++? [Дубликат]

Я написал анализатор XML общего назначения, который может легко обрабатывать файлы GB. Он основан на XMLReader, и он очень прост в использовании:

$source = new XmlExtractor("path/to/tag", "/path/to/file.xml");
foreach ($source as $tag) {
    echo $tag->field1;
    echo $tag->field2->subfield1;
}

Вот github repo: XmlExtractor

4
задан Ziezi 18 January 2016 в 16:31
поделиться

2 ответа

Самый гибкий способ сделать это - преобразовать его в struct tm, а затем использовать strftime (это похоже на sprintf для времени). Что-то вроде:

std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
std::time_t now_c = std::chrono::system_clock::to_time_t(now);
std::tm now_tm = *std::localtime(&now_c);
/// now you can format the string as you like with `strftime`

Посмотрите документацию для strftime здесь .

Если у вас есть localtime_s или localtime_r, вы должны используйте либо предпочтительнее localtime.

Существует много других способов сделать это, но, в то время как в основном их проще использовать, они приводят к некоторому предопределенному строковому представлению. Вы можете просто «скрыть» все вышеперечисленное в функции для удобства использования.

4
ответ дан robinCTS 27 August 2018 в 18:10
поделиться

Бесплатная, открытая версия с открытым исходным кодом Howard Hinnant, переносная библиотека даты / времени - это современный способ сделать это, не трафик через старый API C, и не требует, чтобы вы отбрасываете всю свою второстепенную информацию. Эта библиотека также предлагается для стандартизации .

В форматировании существует большая гибкость. Самый простой способ - просто выпустить:

#include "date.h"
#include <iostream>

int
main()
{
    using namespace date;
    std::cout << std::chrono::system_clock::now() << '\n';
}

Это просто для меня:

2017-09-15 13:11:34.356648

Требуется using namespace date;, чтобы найти оператор потоковой передачи для system_clock::time_point (для моей библиотеки не разрешено вставлять ее в namespace std::chrono). Никакая информация не будет потеряна в этом формате: будет выведена полная точность вашего system_clock::time_point (microseconds, где я запустил это на macOS).

Полный набор strftime флаги форматирования доступны для других форматов, с небольшими расширениями для обработки таких вещей, как дробные секунды. Вот еще один пример, который выводит с миллисекундной точностью:

#include "date.h"
#include <iostream>

int
main()
{
    using namespace date;
    using namespace std::chrono;
    std::cout << format("%D %T %Z\n", floor<milliseconds>(system_clock::now()));
}

, который только что выводит для меня:

09/15/17 13:17:40.466 UTC
4
ответ дан Howard Hinnant 27 August 2018 в 18:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: