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
JavaScript日期中一个错误导致此错误的原因是什么?_Javascript_Date - Fatal编程技术网

JavaScript日期中一个错误导致此错误的原因是什么?

JavaScript日期中一个错误导致此错误的原因是什么?,javascript,date,Javascript,Date,我正在尝试编写一个函数,它将使用07/2020这样的字符串,然后返回是否还有三个多月的时间 我已经写了一个函数超过3个月,我有理由相信它能正常工作: 常数大于3个月, 现在=新日期, target=new DateDate.UTCutcYear,utcMonth, 三个月路程=新的Datenow.valueOf.setUTCMonthnow.getUTCMonth+3=> 目标>三个月后 console.logismorethan 3个月{utcYear:2020,utcMonth:7}//正

我正在尝试编写一个函数,它将使用07/2020这样的字符串,然后返回是否还有三个多月的时间

我已经写了一个函数超过3个月,我有理由相信它能正常工作:

常数大于3个月, 现在=新日期, target=new DateDate.UTCutcYear,utcMonth, 三个月路程=新的Datenow.valueOf.setUTCMonthnow.getUTCMonth+3=> 目标>三个月后
console.logismorethan 3个月{utcYear:2020,utcMonth:7}//正确 看起来您在混合使用Date.UTC,而不是在实例化日期时。例如,如果将以下内容用于验证函数:

const validate = (str, 
                  [month, year] = str.split('/'), 
                  date = new Date(Date.UTC(+year, (+month)-1))) => 
    isMoreThan3MonthsHence({ utcYear: date.getUTCFullYear(), utcMonth: date.getUTCMonth() })

// Note: input is one-based months
console.log(validate('07/2020')) // Now true
它按预期工作:

完全删除Date.UTC将在用户的本地时区执行计算,并包括任何适用的夏令时调整。这可能被视为一种有效的方法,但会导致您描述的行为


注意,我已经根据Bergi的反馈重命名了带有前缀的局部变量。使用Date.UTC意味着您在传递UTC参数。

看起来您在混合使用Date.UTC,而不是在实例化日期时。例如,如果将以下内容用于验证函数:

const validate = (str, 
                  [month, year] = str.split('/'), 
                  date = new Date(Date.UTC(+year, (+month)-1))) => 
    isMoreThan3MonthsHence({ utcYear: date.getUTCFullYear(), utcMonth: date.getUTCMonth() })

// Note: input is one-based months
console.log(validate('07/2020')) // Now true
它按预期工作:

完全删除Date.UTC将在用户的本地时区执行计算,并包括任何适用的夏令时调整。这可能被视为一种有效的方法,但会导致您描述的行为


注意,我已经根据Bergi的反馈重命名了带有前缀的局部变量。使用Date.UTC意味着您在传递UTC参数。

除了混合UTC和本地日期之外,您添加3个月的方式将导致对3月31日等日期的错误响应,其中仅通过增加月数添加3个月将导致7月1日的日期。看

因此,如果在3月31日运行,验证“072020”将返回false

要解决这个问题,在添加月份时,请检查更新的日期是否仍在该月份的同一天,否则它将被滚动,因此将其设置为上个月的最后一天

函数验证{ 设testDate=addmonthsnewdate,3; 设[m,y]=s.split/\D/; 返回testDate<新日期y,m-1; }; 函数addMonthDate,月{ 设d=date.getDate; date.setMonthdate.getMonth++月数; //如果滚动到下个月,则设置为上个月的最后一天 如果date.getDate!=d{ date.setDate0; } 返回日期; } //样品 console.log'On'+new Date.toDateString+':'; ['07/2020'、'04/2020'],forEach s=>console.logs+'-'+验证
; 除了混合UTC和本地日期之外,您添加3个月的方式将导致对3月31日等日期的错误响应,其中仅通过增加月数添加3个月将导致7月1日的日期。看

因此,如果在3月31日运行,验证“072020”将返回false

要解决这个问题,在添加月份时,请检查更新的日期是否仍在该月份的同一天,否则它将被滚动,因此将其设置为上个月的最后一天

函数验证{ 设testDate=addmonthsnewdate,3; 设[m,y]=s.split/\D/; 返回testDate<新日期y,m-1; }; 函数addMonthDate,月{ 设d=date.getDate; date.setMonthdate.getMonth++月数; //如果滚动到下个月,则设置为上个月的最后一天 如果date.getDate!=d{ date.setDate0; } 返回日期; } //样品 console.log'On'+new Date.toDateString+':'; ['07/2020'、'04/2020'],forEach s=>console.logs+'-'+验证
;也许是因为Date.UTC将您的参数视为UTC,而new Date将它们视为本地UTC+1,并且从UTC的角度来看,一旦您调用getUTCMonth,您实际上比上个月早了一个小时。为什么不在两者中都使用Date.UTC?使用new Date2020,6.toutstring-即查看整个日期,而不仅仅是月份和年份-您将清楚地看到原因。是的,这确实与您在7月的英国夏令时有关。可能是因为Date.UTC将您的参数视为UTC,而new Date将它们视为本地UTC+1,并且从UTC的角度来看,一旦您调用getUTCMonth,您确实比上个月早了一个小时。为什么不在两者中都使用Date.UTC?使用new Date2020,6.toutstring-即查看整个日期,而不仅仅是月份和年份-您将清楚地看到原因。是的,这确实与你7月份在英国夏令时有关。链接问题中的首要答案具有高度误导性。“你愿意把它编辑得更准确吗?”本把链接的答案改成了一个更好的答案。谢谢。其实我已经进去编辑了原本链接的答案。这是一个误导性很强的问题,相关问题的首要答案是High
这是一种误导。“你愿意把它编辑得更准确吗?”本把链接的答案改成了一个更好的答案。谢谢。其实我已经进去编辑了原本链接的答案。这是高度误导性的。