Что делает strptime с информацией, которую он читает/преобразует?

Спецификация для strptime:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/strptime.html

в основном ясно о возможных спецификациях преобразования и о том, какие входные данные они требуют. Однако, по-видимому, нет спецификации того, как эта функция сохраняет результаты в файле struct tm. Что должно произойти, если несколько спецификаторов считывают частично или полностью конфликтующие данные. Простым примером может быть наличие как %m, так и %b (или даже дублирования %m) чтения конфликтующих месяцев, но, возможно, более интересным примером является конфликт %d (день месяца) и %a (день недели). Что имеет приоритет? Предполагается ли вообще, что strptime обеспечивает непротиворечивый вывод в struct tm или просто сохраняет поля как прочитанные? Некоторые вещи, такие как %W (неделя года), не имеют прямого представления в struct tm, поэтому я предполагаю, что они должны приводить к генерации производного вывода на основе других полей, но неясно, когда это применимо.

Я понимаю, что, поскольку спецификации, похоже, не хватает, я могу попросить ответ, которого просто не существует, но вещи, которые могут охарактеризовать полезный ответ, будут следующими:

  • поведение исторических реализаций, на которых базировалась стандартизированная функция.
  • ссылки на соответствующие отчеты о дефектах
  • ссылки на прошлые обсуждения темы (списки рассылки, багтрекеры, юзнет и т.д.)
  • другие связанные стандарты для анализа времени

person R.. GitHub STOP HELPING ICE    schedule 17.08.2011    source источник


Ответы (1)


Дополнительные поля можно использовать для проверки даты. Проверка и проверка, вы можете преобразовать строку в серию чисел, которые повторно представляют дату, затем вы должны убедиться, что все эти числа относятся к одной правильной дате, например. день недели правильный, если дата недействительна, то strptime возвращает NULL.

person Steve-o    schedule 17.08.2011
comment
Значит, все, что strptime конвертирует, должно быть непротиворечивым, но не обязательно полным? - person R.. GitHub STOP HELPING ICE; 17.08.2011
comment
@R.. это то, что я бы сделал с разумным поведением. Очевидно, что некоторые реализации не нуждаются в проверке согласованности и просто возвращают мусор аля GIGO. - person Steve-o; 17.08.2011
comment
А как насчет производных значений, если это не вопрос согласованности? Например, если я прочитаю день года и год, могу ли я ожидать, что смогу найти значимые значения в полях месяца, дня месяца и дня недели или только в полях дня? поля года и года? Конечно, если год не указан, strptime не сможет предоставить ничего из этого, кроме прочитанного значения дня года... - person R.. GitHub STOP HELPING ICE; 17.08.2011
comment
@R .. ну, варианты либо 0 (начало эпохи), либо берут значения из текущего времени. Поэтому, если вы укажете пятницу, это будет означать 2011 год. Однако man strptime показывает, что он устанавливает только те значения, которые вы предоставляете, поэтому третий вариант. - person Steve-o; 17.08.2011