Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按周添加日期会产生错误的日期。为什么会这样?_Javascript_Date_Date Arithmetic - Fatal编程技术网

Javascript 按周添加日期会产生错误的日期。为什么会这样?

Javascript 按周添加日期会产生错误的日期。为什么会这样?,javascript,date,date-arithmetic,Javascript,Date,Date Arithmetic,我做了一个有教育目的的小项目(为我自己)。该项目包括根据给定的周数计算日期之间的周数或开始或最终日期。在任何时候,用户都必须输入以下两个值: 开始日期 结束日期 周数 在Begging,它工作了,但是在一些测试之后,我注意到它抛出了错误的值。例如,对于2018年3月22日(2018年3月22日)和28周的开始日期,它会抛出和结束日期2018年3月11日(2018年11月3日),这是错误的,但是,如果我计算开始日期2018年3月22日(2018年3月22日)和结束日期2018年5月10日(20

我做了一个有教育目的的小项目(为我自己)。该项目包括根据给定的周数计算日期之间的周数或开始或最终日期。在任何时候,用户都必须输入以下两个值:

  • 开始日期
  • 结束日期
  • 周数
在Begging,它工作了,但是在一些测试之后,我注意到它抛出了错误的值。例如,对于2018年3月22日(2018年3月22日)和28周的开始日期,它会抛出和结束日期2018年3月11日(2018年11月3日),这是错误的,但是,如果我计算开始日期2018年3月22日(2018年3月22日)和结束日期2018年5月10日(2018年10月5日)的周数,它抛出28周,这是正确的。进一步检查表明,仅在2018年1月4日(2018年4月1日)开始的日期发生

经过一些研究,我发现用毫秒计算日期更好,因为有些浏览器不支持某些日期函数

尽管如此,我想知道是否有关于这种行为的解释

提前谢谢

<script>
    function calcDates(){
        var startInput = document.getElementById("start");
        var endInput = document.getElementById("end");
        var weeksInput = document.getElementById("weeks");
        var startValidation = false;
        var endValidation = false;
        var weeksValidation = false;

        if (startInput.value != "") {
            startValidation = true;
        }
        else{
            startValidation = false;
        }


        if (endInput.value != "") {
            endValidation = true;
        }
        else{
            endValidation = false;
        }

        if (weeksInput.value != "") {
            weeksValidation = true;
        }
        else{
            weeksValidation = false;
        }

        //Calculate weeks number
        if ((startValidation == true && endValidation == true && weeksValidation == false)||document.getElementById("weekRadio").checked == true) {
            document.getElementById("weekRadio").checked = true;
            var start = new Date(startInput.value);
            var end = new Date(endInput.value);
            weeksInput.value = Math.round((end-start)/604800000);
        }

        //Calculate End date
        if ((startValidation == true && endValidation == false && weeksValidation == true)||document.getElementById("endRadio").checked == true) {
            document.getElementById("endRadio").checked = true;
            var start = new Date(startInput.value);
            var weeks = weeksInput.value;
            var end = new Date();
            end.setDate(start.getDate() + (weeks*7));
            console.log(start.getDate());
            console.log(weeks*7);
            console.log(start.getDate()+(weeks*7));
            console.log(end.toISOString().substring(0,10));
            endInput.value = end.toISOString().substring(0,10);
        }

        //Calculate Start date
        if ((startValidation == false && endValidation == true && weeksValidation == true)||document.getElementById("startRadio").checked == true) {
            document.getElementById("startRadio").checked = true;
            var end = new Date(endInput.value);
            var weeks = weeksInput.value;
            var start = new Date();
            start.setDate(end.getDate() - (weeks*7));
            console.log(-weeks*7);
            console.log(end.toISOString().substring(0,10));
            startInput.value = start.toISOString().substring(0,10);
        }
    }
</script>

函数calcDates(){
var startInput=document.getElementById(“开始”);
var endInput=document.getElementById(“结束”);
var weeksInput=document.getElementById(“周”);
var startValidation=假;
var-endValidation=false;
var weeksValidation=false;
如果(startInput.value!=“”){
startValidation=真;
}
否则{
startValidation=假;
}
如果(endInput.value!=“”){
endValidation=true;
}
否则{
endValidation=false;
}
如果(weeksInput.value!=“”){
weeksValidation=true;
}
否则{
weeksValidation=false;
}
//计算周数
if((startValidation==true&&endValidation==true&&WeekValidation==false)| document.getElementById(“weekRadio”).checked==true){
document.getElementById(“weekRadio”).checked=true;
var start=新日期(startInput.value);
var end=新日期(endInput.value);
weeksInput.value=数学圆((结束-开始)/604800000);
}
//计算结束日期
if((startValidation==true&&endValidation==false&&weekValidation==true)| | document.getElementById(“endRadio”).checked==true){
document.getElementById(“endRadio”).checked=true;
var start=新日期(startInput.value);
var weeks=weeksInput.value;
var end=新日期();
end.setDate(start.getDate()+(周*7));
console.log(start.getDate());
控制台日志(周*7);
log(start.getDate()+(周*7));
log(end.toISOString().substring(0,10));
endInput.value=end.toISOString().substring(0,10);
}
//计算开始日期
if((startValidation==false&&endValidation==true&&weekValidation==true)| | document.getElementById(“startRadio”).checked==true){
document.getElementById(“startRadio”).checked=true;
var end=新日期(endInput.value);
var weeks=weeksInput.value;
var start=新日期();
start.setDate(end.getDate()-(周*7));
console.log(-周*7);
log(end.toISOString().substring(0,10));
startInput.value=start.toISOString().substring(0,10);
}
}
“相对于当前设置的月初设置日期对象的日期。”

在下面的代码片段中,
end
当前设置的月份将从代码执行时的任何月份开始。而
setDate
将设置新的日期值,该值相对于所选月份的开始

var end = new Date();
end.setDate(start.getDate() + (weeks*7));
为了在此场景中获得预期结果,您应该使用此代码段,它将
end
初始化为
startInput.value
时间(包括正确的月份):


“在MaliSimDS中进行日期计算是更好的,因为有些浏览器不支持一些日期函数”是没有根据的。说出一个不支持所有内置ECMA-262日期方法的浏览器。使用内置解析器,如
newdate(startInput.value)
是一个非常糟糕的主意,请参阅Thaks,了解我缺乏基础的观察结果。我认为最好的方法是手动解析,然而,在cybersam给出答案之后,它就可以正常工作了……直到它不工作为止。非常感谢。我已经在我的页面上测试了它,它就像一个符咒:)
var end = new Date(startInput.value);
end.setDate(start.getDate() + (weeks*7));