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 减去1个月至2015-12-31,得出2015-12-01_Javascript_Date_Subtraction - Fatal编程技术网

Javascript 减去1个月至2015-12-31,得出2015-12-01

Javascript 减去1个月至2015-12-31,得出2015-12-01,javascript,date,subtraction,Javascript,Date,Subtraction,我试图从2015-12-31中减去一个月,但它给了我2015-12-01,而不是2015-11-30。为什么? 代码: 输出: Thu Dec 31 2015 01:00:00 GMT+0100 (CET) Tue Dec 01 2015 01:00:00 GMT+0100 (CET) 任何解决方法?根据“如果未指定[可选]dayValue参数,则使用从getDate()方法返回的值”。由于未指定可选参数,因此代码尝试将日期设置为2015-11-31,这是无效的。JavaScript通过将日期

我试图从
2015-12-31
中减去一个月,但它给了我
2015-12-01
,而不是
2015-11-30
。为什么?

代码:

输出:

Thu Dec 31 2015 01:00:00 GMT+0100 (CET)
Tue Dec 01 2015 01:00:00 GMT+0100 (CET)
任何解决方法?

根据“如果未指定[可选]
dayValue
参数,则使用从
getDate()
方法返回的值”。由于未指定可选参数,因此代码尝试将日期设置为2015-11-31,这是无效的。JavaScript通过将日期设置为2015-11-30之后的一天(即2015-12-01)来解决这种情况


至于解决方法,这取决于你实际想做什么。你想从12月31日起31天内回去吗?或者你想在12月前得到一个月的最后一天?日期语义极其复杂;当不可避免的边缘情况出现时,您将怎么做?

它将生成所需的结果,即从给定的日期减去1个月。但请记住,一个月的时间是可变的。11月31日实际上是12月1日(就像11月55日实际上是12月25日,圣诞节)。要获得上个月的最后一天,您可以执行以下操作:

var date = new Date('2015-12-31');
date.setDate(-1)
试试这个

var date1 = new Date('2015-12-31');
var date2 = new Date(date1);
date2.setDate(date2.getDate()-date1.getDate()); 
alert(date2)

减去月份时,可以检查调整日期的日期是否与初始日期的日期不同。如果是,则它必须已滚动到下一个月,因此将调整日期的日期设置为0,以便转到上一个月的最后一天,例如

函数减去月份(日期,月份){
var day=date.getDate();
date.setMonth(date.getMonth()-months);
如果(date.getDate()!=day)date.setDate(0);
返回日期;
}
//2016年3月31日-1个月=2015年2月29日
[[新日期(2016年2月31日),1],
//2016年2月29日-12个月=2015年2月28日
[新日期(2016,1,29),12],
//2016年2月15日-3个月=2015年11月15日
[新日期(2016,1,15,3)]。forEach(职能部门(arr){
文件。写入(“
”+减去个月(arr[0],arr[1]);
})
好吧,从技术上讲,你试图用11月31日的方式使用它,这是不存在的。我得到了2015年11月30日周一19:00:00 GMT-0500(东部标准时间)@j08691,即UTC 2015年12月1日00:00:00@Devon那么,正确的方法是什么呢?moment.js的内容太多了。当你将一个月减去一个月的最后一天时,你希望得到上个月的最后一天。至少这是我的观点,这也是我想要实现的。请注意,MDN不是ECMAScript的权威,语言规范是,即。setMonth的算法在中(在MDN上有很好的总结)。在
date2.setDate(date2.getDate()-date2.getDate())中对其进行了简化并且它可以工作。谢谢这只适用于一个月的最后一天,因此并不是一个普遍的解决方案。还有一些日子(如3月30日)不是一个月的最后一天,并且有相同的问题,还有一些日子是3月29日间歇性地有问题。@RobG是的,但要求的是结束日期,在这种情况下,它会work@JaydipJ-首先弄清楚这个算法是否适用或其他什么方法似乎是不明智的,然后,当有一个算法在所有情况下都有效时,应用适当的算法。@RobG是的,你是对的。需要通用解决方案,谢谢您的建议
var date1 = new Date('2015-12-31');
var date2 = new Date(date1);
date2.setDate(date2.getDate()-date1.getDate()); 
alert(date2)