比较 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
中取出日期部分(日、月、年)。
另外,您写的是客户端时间设置有误。这是最少的问题。恶意用户可以更改它并在不受支持的时间提交内容。因此,执行此类客户端验证必须始终得到后续服务器验证的支持。客户端部分只是为了给用户快速反馈,但就数据有效性而言,它不能起到真正的验证目的。
我正在创建一个只能在营业时间提交的表格。使用警报调用向我显示每个日期变量的时间,我可以看到时间都符合预期,但不知何故无论何时提交表单。我想寻求帮助,让它按照我的意愿工作。我已经尝试更改 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
中取出日期部分(日、月、年)。
另外,您写的是客户端时间设置有误。这是最少的问题。恶意用户可以更改它并在不受支持的时间提交内容。因此,执行此类客户端验证必须始终得到后续服务器验证的支持。客户端部分只是为了给用户快速反馈,但就数据有效性而言,它不能起到真正的验证目的。