2014-01-17 2 views
2

Я пытаюсь разобрать строку в struct tm, используя strptime. Выглядит достаточно просто, но он не заполняет год правильно (да, я знаю о сдвиге 1900) - после вызова год устанавливается в 0. Другие поля выглядят нормально. Смотрите ниже:C++ strptime не заполняется в году

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_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} 

Я уверен, что я m пропустить что-то простое - может ли кто-нибудь указать мне на это?

+2

Я бы предположил, что он пытается сопоставить всю строку в% Z – PlasmaHH

+0

Он работает в Python, хотя и не в C++: '>>> datetime.datetime.strptime (" Пт Янв 17 09:44:33 UTC 2014 " , "% a% b% d% H:% M:% S% Z% Y") datetime.datetime (2014, 1, 17, 9, 44, 33) ' –

+0

Да, вот и все. Если я удалю% Z и использую следующую строку форматирования, я получу год правильно: «% a% b% d% H:% M:% S UTC% Y». Поскольку я знаю, что все время будет в UTC, я могу уйти с этим, хотя и не изящным. Я мог бы попробовать sscanf-подход ... – dcdunne

ответ

2

В моей системе (Mac OS X), man strptime имеет эту заметку о% Z:

% формат Z спецификатор принимает только часовые пояса аббревиатуры часового пояса , или значение «GMT ». Это ограничение связано с неоднозначностью из-за чрезмерной загрузки сокращений часовых поясов. Одним из таких примеров является EST, который является как восточным стандартным временем, так и летним временем Восточной Австралии.

И действительно, если я изменю свой «UTC» на «GMT», код внезапно работает. Обратите внимание, что Python по какой-либо причине более умен и поддерживает «UTC».

+0

Спасибо за быстрые ответы. Как я уже говорил выше, я могу обойти это сейчас, когда знаю эту проблему! – dcdunne

Смежные вопросы