2015-12-05 5 views
1

Я работаю над созданием формы, которая должна быть представлена ​​только в рабочее время. Используя предупреждения, чтобы показать мне время каждой из переменных даты, я могу видеть, что время все так, как ожидалось, но каким-то образом форма отправляется независимо от времени. Я хотел бы попросить помощи, чтобы это работало, как я хочу. Я экспериментировал с изменением выражений внутри оператора if-else уже без успеха.Сравнение дат JavaScript не работает должным образом

Чтобы уточнить даты; часы работы во время обеда - с 12 до 14 часов, а часы работы - с 17:00 до 23:00.

Это Java-функция для проверки или не подавать форму:

function startOrder() 
{ 
    var now = new Date(); 
    //var d = new Date(year, month, day, hours, minutes, seconds, milliseconds); 
    var lunchOpen = new Date(2015, 11, 5, 12, 00, 00, 00); 
    var lunchClose = new Date(2015, 11, 5, 14, 00, 00, 00); 
    var eveningOpen = new Date(2015, 11, 5, 17, 00, 00, 00); 
    var eveningClose = new Date(2015, 11, 5, 23, 00, 00, 00); 

    alert("NOW: " + now); 
    alert("LUNCH OPEN: " + lunchOpen); 
    alert("LUNCH CLOSE: " + lunchClose); 
    alert("EVENING OPEN: " + eveningOpen); 
    alert("EVENING CLOSE: " + eveningClose); 

    if ((now > lunchOpen) && (now < lunchClose) == false) 
    { 
     document.getElementById('error_Message').innerHTML = "Sorry, we're not open at the moment. You can check our opening times <a href=\"information.html\" class=\"content_Links\">here</a>."; 
    } 
    else if ((now > eveningOpen) && (now < eveningClose) == false) 
    { 
     document.getElementById('error_Message').innerHTML = "Sorry, we're not open at the moment. You can check our opening times <a href=\"information.html\" class=\"content_Links\">here</a>."; 
    } 
    else 
    { 
     document.forms["startOrderForm"].submit(); 
    } 
} 

В какой-то момент мне нужно будет изменить все переменные даты, которые держат часы работы на текущую дату, так что они содержат текущая дата в год, месяц и день, как это ...

var lunchOpen = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 12, 00, 00, 00); 

замечу, что я знаю, что эта система не будет полностью надежным, поскольку устройство клиента не может быть правильно установленное время. У меня есть решение для этого, которое я буду применять позже.

Большое спасибо за помощь. Если вам нужна дополнительная информация, просто оставьте комментарий. Надеюсь, я не ошибаюсь.

ответ

2
if ((now > lunchOpen) && (now < lunchClose) == false) 

это, если линия оценивается, как

(now > lunchOpen) && ((now < lunchClose) == false) 

Чтобы оценить, как задумано, изменить код

if ((now>lunchOpen && now<lunchClose) == false) 

Это также идет по этой линии

if ((now > eveningOpen) && (now < eveningClose) == false) 

Должно быть

if ((now>eveningOpen && now<eveningClose) == false) 
+0

Просто избавьтесь от '== false'. – RobG

+0

@RobG удаление '== false' вообще не поможет – Oli

+0

@firstTimer Спасибо за ваш ответ, отлично работает сейчас! – Oli

1

Одна ошибка, я вижу, что у вас есть

var now = Date(); 

Оно должно быть:

var now = new Date(); 

, как вы есть, теперь не будет экземпляром Date.

+0

Спасибо за ваш ответ @Robusto. Я только что изменил это и протестировал его в это время, что не должно допускать отправки формы. Форма все еще присутствует. Спасибо за распознавание этой ошибки, я обновил код в вопросе, чтобы соответствовать тому, что у меня есть, которое не работает должным образом. – Oli

1

У вас возникли проблемы с кодом. Сначала вам необходимо проверить приоритет оператора == и <, как это было предложено firstTimer. Поскольку результат сравнения уже является логическим, не сравнивайте это снова, но используйте его непосредственно в условии if (вы по-прежнему можете отрицать !, если это действительно необходимо).

Вторая проблема, хотя это логическая проблема: вы напишете, что вы не открыты, если время не в обеденное время, что, в конечном итоге, будет проводить только вечернее сравнение, когда оно находится в обеденном перерыве. Это бессмысленно...

поэтому я хотел бы сделать комбинированную положительную проверку и в противном случае предположим, она закрыта, как это:

if (((now >= lunchOpen) && (now < lunchClose)) || 
    ((now >= eveningOpen) && (now < eveningClose))) 
{ 
    document.forms["startOrderForm"].submit(); 
} 
else 
{ 
    document.getElementById('error_Message').innerHTML = "Sorry, we're not open at the moment. You can check our opening times <a href=\"information.html\" class=\"content_Links\">here</a>."; 
} 

Третья проблема (которую вы знаете о) это с датами, вы используете день, месяц и год, но я предполагаю, что вы только после времени. Если вы хотите придерживаться даты, выберите дату (день, месяц, год) из now при построении переменных времени открытия и закрытия.

Кроме того, вы пишете, что клиент может установить неправильное время. Это наименьшая из проблем. Злоумышленник может просто изменить это и отправить вещи в неподдерживаемые времена. Таким образом, выполнение такой проверки на стороне клиента должно всегда поддерживаться последующей проверкой сервера. Клиентская часть доступна только для того, чтобы дать пользователю быструю обратную связь, но она не может служить реальной целью проверки в отношении действительности данных.

+0

Вы абсолютно правы @Lucero. – Oli

Смежные вопросы