我创建了一个网页,用于计算两个日期之间的周数和天数。 在Chrome中,这个页面可以工作,并为我提供4周和2天的日期2016年1月1日和2016年1月31日的输出,但firefox给了我130周和两天的输出。 我怎样才能改变它以获得chrome的输出。 非常感谢
<html>
<head>
<title>Time Between Dates Calculator</title>
<script src="dateCalc.js"></script>
</head>
<body>
<h1>Calculate the Amount of Time Between Dates:</h1>
<form>
Enter Date 1 (mm/dd/yyyy): <input type="date" id="date1" name="date1" required> <br />
Enter Date 2 (mm/dd/yyyy): <input type="date" id="date2" name="date2" required> <br />
<input type="submit" onclick="datecalc()" Value="Get Weeks and days">
</form>
</body>
</html>
***********************************************************************
function datecalc()
{
firstDate = document.getElementById("date1").value;
secondDate = document.getElementById("date2").value;
/*window.alert(firstDate);
window.alert(secondDate);*/
firstDateMs = new Date(firstDate).getTime();
secondDateMs = new Date(secondDate).getTime();
msPerDay = 24 * 60 * 60 * 1000;
msLeft = (secondDateMs - firstDateMs);
daysLeft = Math.round(msLeft/msPerDay);
weeksLeft = Math.round(daysLeft/7);
total = (daysLeft-(weeksLeft*7))
window.alert("The difference between these days is: " + weeksLeft + " weeks and " + total + " days.");
}
答案 0 :(得分:2)
一种解决方案是在输入字符串上使用.split("/")
,然后使用
new Date(year, month, day);
构造函数。
在Javascript日期,1月份是0,12月份是11 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date
这将消除对日期的可能字符串解释的任何歧义。
firstDate = document.getElementById("date1").value;
secondDate = document.getElementById("date2").value;
/*window.alert(firstDate);
window.alert(secondDate);*/
firstDate.split("/");
secondDate.split("/");
firstDateMs = new Date(parseInt(firstDate[2]), parseInt(firstDate[0]) - 1, parseInt(firstDate[1])).getTime();
secondDateMs = new Date(parseInt(secondDate[2]), parseInt(secondDate[0]) - 1, parseInt(secondDate[1])).getTime();
答案 1 :(得分:0)
提交监听器应该在表单上,而不是提交按钮,因为可以在不单击按钮的情况下提交表单。此外,应将日期字符串手动解析为日期,因为它们取决于用户输入,验证的值。如果处理程序传递对表单的引用,它也可以使生活更容易,因此控件是通过名称而不是 getElementById 访问的。
输入类型日期不受支持,并且创建的问题比现在解决的问题多,所以最好使用类型文本(或使用您自己的日期选择器)。以下内容使用输入类型文本,并以m / d / y格式手动分析和验证字符串。
对于真实表单,最好分别验证每个日期并为无效的日期添加错误消息,以便将解析的日期回显到屏幕,以便用户可以看到代码是使用他们期望的日期(例如,1/2/2016发布时间为1月2日而不是2月1日)。
一些代码......
function datecalc(form) {
var d1 = parseMDY(form.date1.value);
var d2 = parseMDY(form.date2.value);
var msDay = 8.64e7;
var msWeek = msDay * 7;
var result;
// Deal with in valid input
if (isNaN(+d1) || isNaN(+d2)) {
result = 'Invalid date';
} else {
// Get weeks and days
var diff = d2 - d1;
result = (diff/msWeek | 0) + ' weeks ' +
Math.round((diff % msWeek)/msDay | 0) + ' days';
}
// Should return an array of say [weeks, days] and leave formatting
// to some other function.
form.result.value = result;
}
function parseMDY(s) {
var b = s.split(/\D/);
var d = new Date(b[2], --b[0], b[1]);
return d && d.getMonth() == b[0]? d : new Date(NaN);
}
&#13;
<form onsubmit="datecalc(this); return false;">
Enter Date 1 (mm/dd/yyyy): <input type="text" name="date1" value="3/1/2016"><br>
Enter Date 2 (mm/dd/yyyy): <input type="text" name="date2" value="3/23/2016"><br>
<input type="reset"> <input type="submit" Value="Get Weeks and days"><br>
<input type="text" name="result" readonly>
</form>
&#13;
我想你已经把这些日子弄清楚,以消除夏令时错误,请小心。另一种方法是从日期值中获取天数差异,而不是创建日期对象。这消除了DST的任何问题(但验证日期大约需要3行代码)。