Я пытаюсь разобрать строку в struct tm, используя strptime. Выглядит достаточно просто, но он не заполняет год правильно (да, я знаю о смещении 1900) — после вызова год устанавливается на 0. Другие поля выглядят нормально. Увидеть ниже:
struct tm tm;
memset(&tm, 0, sizeof(struct tm));
strptime("Fri Jan 17 09:44:33 UTC 2014", "%a %b %d %H:%M:%S %Z %Y", &tm);
После вызова strptime структура tm выглядит следующим образом: обратите внимание, что tm_year = 0, где я ожидаю, что он будет 114:
{tm_sec = 33, tm_min = 44, tm_hour = 9, tm_mday = 17, tm_mon = 0, tm_year = 0,
tm_wday = 5, tm_yday = 0, tm_isdst = 0, tm_gmtoff = 0, tm_zone = 0x0}
Я уверен, что упускаю что-то простое — кто-нибудь может указать мне на это?
В моей системе (Mac OS X) man strptime
имеет это примечание о% Z:
Спецификатор формата% Z принимает только сокращения часовых поясов
местный часовой пояс или значение
«ВРЕМЯ ПО ГРИНВИЧУ». Это ограничение связано с неоднозначностью из-за перегрузки сокращений часовых поясов.
Одним из таких примеров является EST, который является восточным стандартным временем и летним временем Восточной Австралии.
И действительно, если я изменю ваш «UTC» на «GMT», код неожиданно сработает. Обратите внимание, что Python по какой-то причине здесь умнее и поддерживает также UTC.
Других решений пока нет …