|
|
ru.cgi.perl- RU.CGI.PERL ------------------------------------------------------------------ From : Andrey Sapozhnikov 2:5020/400 30 Dec 2001 16:30:53 To : Simohin Alex Subject : Re: Проверка даты -------------------------------------------------------------------------------- Simohin Alex wrote: > Как можно проверить правильность введенных дня, месяца и года перед > преобразованием в дату? А какие даты считать валидными? Если 32-разрядные POSIX.1 (начинающиеся от 1 января 1970 и заканчивающиеся в январе 2038), то примерно так (месяцы нумеруются с нуля): sub is_valid_date { my ($day, $mon, $year) = @_; $year >= 1970 && $year <= 2037 or return; $mon >= 0 && $mon <= 11 or return; my $days = ($mon == 3 || $mon==5 || $mon == 8 || $mon == 10) ? 30 : $mon != 1 ? 31: $year%4 ? 28: 29; $day >= 1 && $day <= $days; } Для упрощения, маленький хвостик (18 последних дней POSIX.1 эпохи) считается невалидным (все равно пора будет уже задуматься о переделке :)) Так же не всегда может быть валидным 1 января 1970. Зависит от времени и таймзоны. Hапример в час ночи 1 января 1970 года по Москве, по Гринвичу было еще 31 декабря 1969 года. Эта дата не конвертируется в POSIX.1. Если интересует проверка любой даты григорианского календаря, то нужно еще иметь в виду, что года кратные 100, но не кратные 400 были не високосными, а 0 года не существовало. Hад високосностью лет до н.э. не задумывался... Андрей --- ifmail v.2.15dev5 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.cgi.perl/52840acfa966.html, оценка из 5, голосов 10
|