比较 JavaScript 日期未按预期工作

Comparing JavaScript dates not working as intended

我正在创建一个只能在营业时间提交的表格。使用警报调用向我显示每个日期变量的时间,我可以看到时间都符合预期,但不知何故无论何时提交表单。我想寻求帮助,让它按照我的意愿工作。我已经尝试更改 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);

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

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

我看到的一个错误是你

var now = Date();

应该是:

var now = new Date();

按照你的方式,now 将不是 Date 的实例。

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)

您的代码有不同的问题。首先,您必须按照 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 中取出日期部分(日、月、年)。

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