|
|
|
| Есть два поля с датой, куда пользователь вводит диапазон.
Надо проверить, чтобы дата "ОТ" была не позже даты "ДО"
Но если диапазон 23-12-2010 - 2-01-2011 - т.е. на стыке годов, функция дает сбой.
Каким условием можно проверить этот диапазон?
Поля даты -
<input id="datepicker" type="text" name="date_from" value="" />
<input id="datep" type="text" name="date_to" value="">
функция проверки у меня такая:
function CheckDate(){
var d1 = document.getElementById('datepicker');
var d2 = document.getElementById('datep');
str1 = d1.value;
str2 = d2.value;
date1 = str1.substring(0,2);
month1 = str1.substring(3,2);
year1 = str1.substring(6,4);
date2 = str2.substring(0,2);
month2 = str2.substring(3,2);
year2 = str2.substring(6,4);
if(d1.value !='' && d1.value !=''){
if(date1>=date2 && month1==month2){
alert("Дата начала тура 'от' не может быть позже даты 'до'");
return false; }
if(month1>month2 && year1!=year2){
alert("Дата начала тура 'от' не может быть позже даты 'до'");
return false;
}
if(year1>year2){
alert("Дата начала тура 'от' не может быть позже даты 'до'");
return false;
}
} else{
alert("Вы не ввели диапазон дат");
return false;
}
return true;
}
|
функция вызывается по onSubmit() формы. | |
|
|
|
|
|
|
|
для: Лена
(26.12.2010 в 21:35)
| |
function CheckDate ()
{
with (document) var d1 = getElementById ('datepicker').value, d2 = getElementById ('datep').value;
if (!d1 || !d2) {alert ('Вы не ввели диапазон дат'); return false}
var ar1 = d1.split ('-'), ar2 = d2.split ('-');
var vd1 = new Date (ar1 [2], parseInt (ar1 [1], 10) - 1, parseInt (ar1 [0], 10)).valueOf ();
var vd2 = new Date (ar2 [2], parseInt (ar2 [1], 10) - 1, parseInt (ar2 [0], 10)).valueOf ();
if (vd1 > vd2) {alert ("Дата начала тура 'от' не может быть позже даты 'до'"); return false}
return true;
}
|
| |
|
|
|
|
|
|
|
для: АЯ
(26.12.2010 в 22:46)
| | Спасибо, поняла.
Можно вопрос? Почему от значения месяца надо отнимать 1? | |
|
|
|
|
|
|
|
для: Лена
(27.12.2010 в 12:25)
| | Потому что в Javascript'е в объекте new Date () месяцы года нумеруются, начиная с нулевого:
январь - 0
февраль - 1
март - 2
...
ноябрь - 10
декабрь - 11
|
-----
PS. Даты у Вас в поля вводятся "вручную" или "автоматом" (выбором из календаря)?
Если "вручную", то необходима более серьёзная проверка
1) соблюдение формата ДД-ММ-ГГГГ, где Д, М и Г - только цифры.
2) корректность (существование) даты:
- номер месяца от 1 до 12;
- день месяца от 1 до 28, 29, 30 или 31 в зависимости от месяца и високосности года;
А то введут Вам 32 мартобря :-))
Ну и раз это "заказ тура", то дата 'от' должна быть не меньшей, чем текущая дата.
3) Что тоже "по уму" надо бы проверять.
В первом приближении, выглядеть это будет где-то так:
<script>
function CheckDate ()
{
with (document) var d1 = getElementById ('datepicker').value, d2 = getElementById ('datep').value;
if (!d1 || !d2) {alert ('Вы не ввели диапазон дат'); return false}
var re = /^\d\d\-\d\d\-\d\d\d\d$/;
if (d1.search (re) < 0 || d2.search (re) < 0) {alert ('Неверный формат введенных дат'); return false}
var ar1 = d1.split ('-'), ar2 = d2.split ('-'), corr = 0, h24 = 600 * 600 * 240;
for (var j = 0; j < 3; j++) {ar1 [j] = parseInt (ar1 [j], 10); ar2 [j] = parseInt (ar2 [j], 10)}
corr = (ar1 [0] < 1 || ar1 [0] > 31 || ar2 [0] < 1 || ar2 [0] > 31
|| ar1 [1] < 1 || ar1 [1] > 12 || ar2 [1] < 1 || ar2 [1] > 12
|| !ar1 [2] || !ar2 [2]);
if (ar1 [0] == 31)
{
var minDplus24 = new Date (new Date (ar1 [2], ar1 [1] - 1, 30).valueOf () + h24);
if (minDplus24.getDate () != 31) corr = 1;
}
if (ar2 [0] == 31)
{
var minDplus24 = new Date (new Date (ar2 [2], ar2 [1] - 1, 30).valueOf () + h24);
if (minDplus24.getDate () != 31) corr = 1;
}
if (ar1 [0] == 29 && ar1 [1] == 2)
{
var minDplus24 = new Date (new Date (ar1 [2], 1, 28).valueOf () + h24);
if (minDplus24.getDate () != 29) corr = 1;
}
if (ar2 [0] == 29 && ar2 [1] == 2)
{
var minDplus24 = new Date (new Date (ar2 [2], 1, 28).valueOf () + h24);
if (minDplus24.getDate () != 29) corr = 1;
}
if (corr) {alert ('Введена несуществующая дата'); return false}
var vd1 = new Date (ar1 [2], ar1 [1] - 1, ar1 [0]), vd2 = new Date (ar2 [2], ar2 [1] - 1, ar2 [0]);
if (vd1.valueOf () > vd2.valueOf ()) {alert ("Дата начала тура 'от' не может быть позже даты 'до'"); return false}
if (vd1 < new Date ().valueOf ()) {alert ("Ваш самолёт уже улетел"); return false}
return true;
}
</script>
|
Но всё это, повторюсь, является актуальным лишь в случае доступа юзера к полю ввода дат.
Если оно у Вас имеет прописанными атрибут readonly или disabled и юзер не может САМ (без вызова программы календаря) изменить значение полей ввода дат, то весь мой постскриптум можете проигнорировать. | |
|
|
|