Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проверить дату на стыке годов
 
 автор: Лена   (26.12.2010 в 21:35)   письмо автору
 
 

Есть два поля с датой, куда пользователь вводит диапазон.
Надо проверить, чтобы дата "ОТ" была не позже даты "ДО"

Но если диапазон 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 в 22:46)   письмо автору
 
   для: Лена   (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;
}

  Ответить  
 
 автор: Лена   (27.12.2010 в 12:25)   письмо автору
 
   для: АЯ   (26.12.2010 в 22:46)
 

Спасибо, поняла.
Можно вопрос? Почему от значения месяца надо отнимать 1?

  Ответить  
 
 автор: АЯ   (27.12.2010 в 14:02)   письмо автору
 
   для: Лена   (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 и юзер не может САМ (без вызова программы календаря) изменить значение полей ввода дат, то весь мой постскриптум можете проигнорировать.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования