#c #validation #strptime
Вопрос:
функция strptime() в C не может обнаружить недопустимые даты. Например: 2011-02-31 , 2011-04-31. Есть ли какая-либо другая функция или решение этой проблемы
Комментарии:
1. Я ищу что-то, что дало бы мне представление о том, какая часть даты недействительна. Точно так же, как strptime() возвращает указатель на последний проанализированный допустимый символ. Спасибо
Ответ №1:
Вы можете использовать mktime
для нормализации своей структуры после использования strptime
.
struct tm ltm = {0};
char buf[] = "2011-02-31";
puts(buf);
strptime(buf, "%Y-%m-%d", amp;ltm);
mktime(amp;ltm);
strftime(buf, sizeof(buf), "%Y-%m-%d", amp;ltm);
puts(buf);
Приведенный выше пример приведет к следующему результату:
2011-02-31
2011-03-03
Если строки до и после mktime
не совпадают, то вы знаете, что входная строка не была действительной датой.
Если вам нужно знать, какое поле было недопустимым, вы можете сохранить копию ltm
структуры перед вызовом mktime
. Затем вы можете проверить, был ли день ( tm_mday
), месяц ( tm_mon
) или год ( tm_year
) в недопустимом формате. Ибо tm_mon
, 0
это январь, а 11
это декабрь. Ибо tm_year
это число лет , прошедших с тех пор 1900
. Не забудьте учесть високосный год при проверке дня месяца на февраль.
Комментарии:
1. Хммм… тогда я должен перепроверить и проверить, совпадает ли дата до нормализации с датой после нормализации? Это решение.. да, но я искал что-то, что дало бы мне понять, что дата недействительна. Точно так же, как strptime() возвращает указатель на последний проанализированный допустимый символ
2. Это один из способов сделать это. Это проще, чем вручную копаться в
tm
структуре, чтобы проверить, все ли поля правильные.3. @AndyStowAway: Я обновил ответ, указав, как выполнить проверку. С уважением
4. пользователь315052: Хммм, как насчет того, чтобы мы сделали две
tm
структуры. Один с недопустимой датой (до нормализации), а затем еще один после нормализации. Тогда можем ли мы сравнить обе структуры и посмотреть, где произошло несоответствие ?? Какие-либо проблемы в этом решении?5. @AndyStowAway: Это прекрасно. Но я думаю, что strcmp скажет вам то же самое. В принципе, если строки разные, то ошибочным было
tm_mday
поле. Так что, вероятно, вам сначала следует просто проверить это поле.