std::chrono::parse
и std::chrono::from_stream
позволяют нам анализировать множество различных форматов даты/времени.
Но недавно я получил такую строку:
2022-07-10 22:00 GMT+2
- и я не уверен, какой формат мне использовать.
Я пытался:
%F %T GMT%z
- не получается
%F %T GMT%Z
- не получается
%F %T %Z
- не получается
Или, может быть, мне просто нужно разобрать время/дату, а затем вручную получить зону?
Это немного сложно.
%T — это сокращение от %H:%M:%S. Но у вас нет поля секунд, поэтому использование %T
терпит неудачу, когда синтаксический анализ не может найти завершающий :
после минут. Вместо этого используйте %H:%M
.
%Z
(разбор аббревиатуры) жадно примет буквенно-цифровой или один из символов «_», «/», «-» или «+», и поэтому при использовании захватит все GMT+2
. Таким образом, вы правильно используете GMT
вместо %Z
.
Соединяем все это вместе:
istringstream in{"2022-07-10 22:00 GMT+2"};
in.exceptions(ios::failbit);
sys_seconds tp;
in >> parse("%F %H:%M GMT%Ez", tp);
cout << tp << '\n';
Выход:
2022-07-10 20:00:00
Обратите внимание, что применяется смещение, поэтому tp
представляет собой временную метку UTC. Если вместо этого вам нужно местное время, просто измените sys_seconds
на local_seconds
, и вывод изменится на:
2022-07-10 22:00:00
Смещение анализируется, но не применяется.
Спасибо за понятное объяснение!