2015-12-31 减去 1 个月得到 2015-12-01
Subtracting 1 month to 2015-12-31 gives 2015-12-01
我想从 2015-12-31
中减去一个月,但它给了我 2015-12-01
而不是 2015-11-30
。为什么?
代码:
var date1 = new Date('2015-12-31');
var date2 = new Date(date1);
date2.setMonth(date1.getMonth() - 1);
console.log(date1);
console.log(date2);
输出:
Thu Dec 31 2015 01:00:00 GMT+0100 (CET)
Tue Dec 01 2015 01:00:00 GMT+0100 (CET)
任何解决方法?
根据 setMonth
documentation,“如果您未指定 [optional] 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,这样就滚到上个月的最后一天了,例如
function subtractMonths(date, months) {
var day = date.getDate();
date.setMonth(date.getMonth() - months);
if (date.getDate() != day) date.setDate(0);
return date;
}
// 31 Mar 2016 - 1 month = 29 Feb 2015
[[new Date(2016,2,31), 1],
// 29 Feb 2016 - 12 months = 28 Feb 2015
[new Date(2016,1,29), 12],
// 15 Feb 2016 - 3 months = 15 Nov 2015
[new Date(2016,1,15), 3]].forEach(function(arr){
document.write('<br>' + subtractMonths(arr[0], arr[1]));
})
可以使用相同的算法添加月份。请注意,这就是日期算法不对称的原因,例如
31 May + 1 month => 30 June
30 June - 1 month => 30 May
即如果 A + B = C,则 C - B = A 可能为真也可能不为真(反之亦然)。
我想从 2015-12-31
中减去一个月,但它给了我 2015-12-01
而不是 2015-11-30
。为什么?
代码:
var date1 = new Date('2015-12-31');
var date2 = new Date(date1);
date2.setMonth(date1.getMonth() - 1);
console.log(date1);
console.log(date2);
输出:
Thu Dec 31 2015 01:00:00 GMT+0100 (CET)
Tue Dec 01 2015 01:00:00 GMT+0100 (CET)
任何解决方法?
根据 setMonth
documentation,“如果您未指定 [optional] 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,这样就滚到上个月的最后一天了,例如
function subtractMonths(date, months) {
var day = date.getDate();
date.setMonth(date.getMonth() - months);
if (date.getDate() != day) date.setDate(0);
return date;
}
// 31 Mar 2016 - 1 month = 29 Feb 2015
[[new Date(2016,2,31), 1],
// 29 Feb 2016 - 12 months = 28 Feb 2015
[new Date(2016,1,29), 12],
// 15 Feb 2016 - 3 months = 15 Nov 2015
[new Date(2016,1,15), 3]].forEach(function(arr){
document.write('<br>' + subtractMonths(arr[0], arr[1]));
})
可以使用相同的算法添加月份。请注意,这就是日期算法不对称的原因,例如
31 May + 1 month => 30 June
30 June - 1 month => 30 May
即如果 A + B = C,则 C - B = A 可能为真也可能不为真(反之亦然)。