比较JavaScript日期无法正常工作

时间:2015-12-05 01:00:21

标签: javascript html date datetime comparison

我正在制作一张只应在营业时间提交的表格。使用警报调用向我显示每个日期变量的时间我可以看到时间都是预期的,但无论何时,表单都会以某种方式提交。我想请求帮助让我按照我的意愿开始工作。我已尝试在if-else语句中更改表达式但没有成功。

解释日期;午餐时间为中午12点至下午2点,晚上营业时间为下午5点至晚上11点。

这是检查是否提交表单的javascript函数:

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);

我会注意到我知道这个系统不会完全可靠,因为客户端的设备可能没有正确的时间设置。我有一个解决方案,我将在稍后实施。

非常感谢所有的帮助。如果您需要任何额外的细节,请发表评论。我希望我不会在这里犯一个愚蠢的错误。

3 个答案:

答案 0 :(得分:2)

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

此IF行正在评估为

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

要按预期进行评估,请将代码更改为

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

这也属于这一行

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

应该是

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

答案 1 :(得分:1)

我看到的一个错误是你有

var now = Date();

应该是:

var now = new Date();

你拥有它的方式,现在不会是Date的实例。

答案 2 :(得分: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获取日期部分(日,月,年)。

此外,您写道客户端可能设置错误的时间。这是最少的问题。恶意用户可以在不受支持的时间更改并提交内容。因此,进行此类客户端验证必须始终由后续服务器验证支持。客户端部分仅用于向用户提供快速反馈,但就数据有效性而言,它不能用于真正的验证目的。