Обратите внимание, что элемент tm
, обозначающий наименьшее приращение времени, равен tm_sec
, который является int
, который определен только в диапазоне:
Секунды после минуты [0,60] с C++11
Таким образом, вы не сможете сохранить долю секунды в tm
, вам просто нужно будет отбросить число после запятой.
Как предложено Карстеном Купом можно просто прочитать год дважды, второй %Y
затмит первый:
auto fmt = "%H:%M:%S.%Y %Z %b %d %Y";
Живой пример
При этом я бы рекомендовал против использовать strptime
< /a> это функция POSIX, использующая стандартную функцию, такую как get_time
было бы предпочтительнее. У этого есть один небольшой недостаток; get_time
не знает часовых поясов, как и tm
, за исключением tm_isdst
, который является:
Флаг перехода на летнее время. Значение положительное, если действует летнее время, нулевое, если нет, и отрицательное, если нет доступной информации.
Таким образом, вам, возможно, придется назначить tm_isdst
независимо, если вы сделаете что-то вроде этого:
tm tmbuf;
stringstream str("20:48:01.469 UTC MAR 31 2016");
str >> get_time(&tmbuf, "%H:%M:%S.%Y UTC %b %d %Y");
Живой пример
Мой get_time
ответ был немного лицемерным, потому что, говоря о важности стандартизации, я мог заставить его работать только на libc++. Поэтому я решил опубликовать более универсальное решение, которое также отбросит часовой пояс, поэтому вам снова нужно будет установить tm_isdst
независимо:
tm tmbuf{};
stringstream str("20:48:01.469 UTC MAR 31 2016");
string tm_mon;
str >> get_time(&tmbuf, "%T");
str.ignore(std::numeric_limits<std::streamsize>::max(), 'C');
str >> tm_mon >> get_time(&tmbuf, "%d %Y");
for (const auto& i : { "JAN"s, "FEB"s, "MAR"s, "APR"s, "MAY"s, "JUN"s, "JUL"s, "AUG"s, "SEP"s, "OCT"s, "NOV"s, "DEC"s }) {
if (equal(cbegin(tm_mon), cend(tm_mon), cbegin(i), cend(i), [](const unsigned char a, const unsigned char b) { return toupper(a) == b; })) break;
++tmbuf.tm_mon;
}
Живой пример
Это имеет 2 ключевые зависимости:
- Что часовой пояс всегда заканчивается символом
'C'
(он должен быть в верхнем регистре)
- Что аббревиатуры месяца совпадают с одним из тех, что указаны в моем
initializer_list
person
Jonathan Mee
schedule
16.06.2016
"%H:%M:%s.%f %Z %b %d %Y"
- person EdChum   schedule 16.06.2016"%H:%M:%S.%f %Z %b %d %Y"
- person GMichael   schedule 16.06.2016struct tm
для них нет поля. - person Karsten Koop   schedule 16.06.2016