Разбор второй даты с библиотекой дат Говарда Хиннанта - PullRequest
0 голосов
/ 05 января 2019

У меня есть строка с датой вроде YYYYMMDD HHMMSSFFF. Я пытаюсь использовать библиотеку дат Говарда Хиннаца. Фрагмент кода такой,

std::chrono::system_clock::time_point tp;
char date[20] = {0};
std::istringstream ss{date};
ss >> date::parse("%Y%m%d %H%M%S%s", tp);

long ts = (std::chrono::time_point_cast<std::chrono::nanoseconds>(tp)
                     .time_since_epoch() /
                 std::chrono::nanoseconds(1));

Но этот код не читает секунду FFF. Я просмотрел документацию здесь , и там говорится, что %s представляет дробную часть второго раза. Пример значения для даты 20170110 103648340. Но когда я вывожу ts, я получаю 0. Если вам интересно, почему я конвертирую в наносекунды, это потому, что мне нужна дата в наносекундах для других операций.

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Вы также можете разобрать это так:

sys_seconds tp;
int ims;
ss >> parse("%Y%m%d %H%M%2S", tp) >> ims;
return tp + milliseconds{ims};

В %2S говорится: проанализируйте до 2 символов за секунды. Это оставляет последние три цифры, которые еще предстоит проанализировать. Подберите их с помощью целочисленного анализа и преобразуйте это целое число в миллисекунды, и все в порядке.

Это не будет работать, если после 3-х миллисекундных цифр есть завершающие цифры.

0 голосов
/ 05 января 2019

Используйте% T, похоже, работает. Вот пример:

#include <date/date.h>
int main()
{
    std::string dt{ "20190501 113001234" };
    dt = dt.insert(11, ":");
    dt = dt.insert(14, ":");
    dt = dt.insert(17, ".");
    // now we have "20190501 11:30:01.234"

    std::chrono::system_clock::time_point tp;
    std::istringstream ss{ dt };
    ss >> date::parse("%Y%m%d %T", tp);

    long ts = (std::chrono::time_point_cast<std::chrono::nanoseconds>(tp)
        .time_since_epoch() /
        std::chrono::nanoseconds(1));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...