|
|
|
| Написал вчера выражение для проверки корректности введенной даты в формате MySQL TIMESTAMP, т.е. YYYY-MM-DD (время не проверяется) в диапазоне с 1970-01-01 до 2037-12-31 (конец диапазона немного сократил), с учетом количества дней в месяце и високосных годов.
Может кому пригодится!
<?php
$pattern='#^((19[7-9]\d|20[0-2]\d|203[0-7])-((0[469]|11)-(0[1-9]|[12]\d|30)|(0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|(19(8[048]|[79][26])|20([02][048]|[13][26]))-02-(0[1-9]|1\d|2[0-9])|(19([79][01345789]|8[1235679])|20([02][1235679]|1[01345789]|3[013457]))-02-(0[1-9]|1\d|2[0-8]))$#';
?>
|
P.S. Может кто потестит, найдет ошибки? | |
|
|
|
|
|
|
|
для: Sfinks
(15.09.2012 в 10:46)
| | Введенное в отдельное поле, то есть подразумевается в нем только дата? | |
|
|
|
|
|
|
|
для: confirm
(15.09.2012 в 10:58)
| | Да, только дата. Вернее в поле может быть и не только дата, и в другом формате, но РВ проверяет только дату и перед использованием нужно привести к формату YYYY-MM-DD.
Дописать время вроде просто, сложнее с количеством дней в месяце, поэтому я не стал.
Если кому надо будет, допишут сами. Мне не надо было. | |
|
|
|
|
|
|
|
для: Sfinks
(15.09.2012 в 11:23)
| | Ну если ожидается только дата, то зачем парсить?
<?
$str = '12-6/12';
echo strtotime($str)===false ? "Строка ($str) недопустима"
: "$str == " . date('Y-m-d h:i:s',
strtotime($str));
|
PS. Я ведь могу ввести и так дату - 15.9.2012, и это не ошибка. | |
|
|
|
|
|
|
|
для: confirm
(15.09.2012 в 11:31)
| | А в JS?
Кроме того, я не доверяю функции strtotime(), т.к. совсем не уверен, во что она превратит дату, например '01.02.03'.
А если проверять с помощью mktime(), то '32.05.2000' она приведет к '01.06.2000', а должна быть ошибка.
Короче как по мне, то через РВ надежнее всего.
> Я ведь могу ввести и так дату - 15.9.2012
Если есть интерфейс, в котором необходимо ввести дату в строго определенном формате, то не можете!
Например дата выдачи паспорта. Написана она в паспорте '03.10.2003', так и вводите. | |
|
|
|
|
|
|
|
для: Sfinks
(15.09.2012 в 12:07)
| | Это ваше право не доверять, а лучше проверить - строка 01.02.03 вернет текущую дату с временем 2012-09-15 01:02:03.
Что касается JS, то такую кухню на клиенте я вообще бы не городил, ни к чему. Проверки нужно делать на сервере, а на клиенте определяться с допустимым форматом.
А что касается Если есть интерфейс, в котором необходимо ввести дату в строго определенном формате, то не можете!, то зачем вообще вся эта арифметика, не проще ли проверить формат ввода и все?
Написано много, в смысле РГ, но все бес толку, так как не понятно, вроде бы хотим всего, в тоже время не все учитывается, вроде бы хотим только определенного, в тоже время столько условий...
>Короче как по мне, то через РВ надежнее всего.
Это не надежнее, это просто не оправдано. | |
|
|
|
|
|
|
|
для: confirm
(15.09.2012 в 12:21)
| | Любите же вы поубеждать других в чем-либо!
Не хотите, не пользуйтесь. Я выложил для тех, кому надо!
> строка 01.02.03 вернет текущую дату с временем 2012-09-15 01:02:03
А я имел ввиду 1 февряля 2003 года.
> а на клиенте определяться с допустимым форматом.
И зачем мне перегружать и перезаполнять здоровенную форму, если добросовестный клиент опечатался и ввел вместо 2003 года 0203? Или число поставил 42 вместо 24го ?
> не проще ли проверить формат ввода и все?
Под формат DD.MM.YYYY подходит и 88.88.8888
Тогда можно и формат не проверять, если все-равно можно вписать чушь!
> вроде бы хотим всего, в тоже время не все учитывается, вроде бы хотим только определенного, в тоже время столько условий
Условий всего два! Дата должна быть допустимой и проверяться на клиенте (например, но моя ситуация описана ниже).
> это просто не оправдано
Я бы не зарекался. Ситуации бывают разные!
Мне например надо проверить в цикле 180 полей разных форматов. И я не хочу еще разбирать какой тип данных в каждом конкретном поле. Я просто унифицировал имена полей и написал ассоциативный массив РВ, из которого берется шаблон по первым трем буквам имени аргумента массива $_POST. | |
|
|
|
|
|
|
|
для: Sfinks
(15.09.2012 в 12:42)
| | Я не убеждаю, я просто не понимаю этого )
Ну, надо либо определиться с выбором условий, либо...
>Под формат DD.MM.YYYY подходит и 88.88.8888
>Тогда можно и формат не проверять, если все-равно можно вписать чушь!
strtotime() эту чушь не пропустит. Данная функция не просто возвращает метку времени, но и учитывает локаль, так почему этим не пользоваться? Или лучше писать длииииинную портянку с учетом всего? ) В то же время, если у вас такое длинное выражение, то есть ожидающее варианты, ну почему тогда нельзя в русском формате дату указать, или я ленивый и напишу "now", и вернет текущую/дату время. Где тут ошибка? Нет ее. Но коли говорить о допустимом формате, то это гораздо проще, если речь о РВ, так как если соответствует формату, то останется только получить дату/время, и опять таки с помощью strtotime(). А ваши действия предполагают кроме этого еще и в правильный формат преобразовать, как вы пишите, и где же выгода?
>Мне например надо проверить в цикле 180 полей разных форматов.
Тем более не стоит смотреть в сторону РВ. Загляните в руководство, ведь работа с данными типа дата/время, это не одна две функции, а гораздо шире, тем более что в последней версии добавлено еще.
PS. Мне да, мне не надо, я таким не стану методом... Ну разве я сказал, что против того, чтобы вы это здесь выставляли? Да пусть пользуются, если надо. ) | |
|
|
|