Из комментариев выше:
Я изучаю использование библиотеки Говарда. Однако то, что он делает веб-вызов, заставляет меня задуматься Я предполагаю, что если вызов не удастся, он будет использовать локально сохраненные данные названия часового пояса? Мы не будем иметь дело с именами часовых поясов, поэтому мне все равно. Тем не менее, выполнение сетевого вызова может быть проблемой.
Библиотека Говарда имеет многоуровневую структуру:
A базовый уровень , который не нуждается в базе данных часовых поясов IANA и, следовательно, никогда не совершает сетевых вызовов. Это один заголовок, библиотека только для заголовков.
A слой часового пояса , который осведомлен о базе данных часовых поясов IANA. Этот уровень может быть настроен на сетевые вызовы или нет (в зависимости от флагов сборки), или даже использовать базу данных часовых поясов вашей ОС (кроме Windows).
Вашему приложению не требуется слой часового пояса , поскольку он имеет дело только со смещениями UTC, а не с именами или правилами часового пояса.
Вот функция, которая преобразует std::string
с вашим форматом образца в std::chrono::time_point<std::chrono::system_clock, std::chrono::microseconds>
. Этот тип является большим многословным глотком для system_clock::time_point
, за исключением гарантированной точности microseconds
. базовый уровень имеет псевдоним типа для этого типа, называемый date::sys_time<std::chrono::microseconds>
.
#include "date/date.h"
#include <chrono>
#include <iostream>
#include <sstream>
auto
to_sys_time(std::string s)
{
using namespace date;
using namespace std;
using namespace std::chrono;
istringstream in{move(s)};
in.exceptions(ios::failbit);
sys_time<microseconds> tp;
in >> parse("%FT%T%z", tp);
return tp;
}
- Поместите
string
в istringstream
.
- Опционально установите
istringstream
для выдачи исключения, если оно не может что-то проанализировать (вы можете по-разному обрабатывать ошибки).
- Объявите ваш
time_point
с желаемой точностью.
- Разобрать его в нужном формате.
- Верните его.
Вы можете использовать эту функцию следующим образом:
int
main()
{
auto tp = to_sys_time("2018-10-31T14:45:21.778952-07:00");
using date::operator<<;
std::cout << tp << " UTC\n";
std::cout << tp.time_since_epoch() << '\n';
}
- Вызовите
to_sys_time
с нужной строкой ввода.
- Сделать доступными потоковые операторы в
namespace date
.
- Распечатайте
time_point
(это UTC time_point
).
- Извлеките и распечатайте
duration
из time_point
.
Вывод этой программы:
2018-10-31 21:45:21.778952 UTC
1541022321778952µs
В настоящее время эта программа будет портировать на черновую спецификацию C ++ 20, удалив #include "date/date.h"
, using namespace date;
и using date::operator<<;
.