减去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)
有什么变通办法吗?
减去月份时,可以检查调整日期的日期是否与初始日期的日期不同。如果是,则它必须已滚动到下个月,因此将调整日期的日期设置为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可能为真,也可能不为真(反之亦然)。
试试这个
var date1 = new Date('2015-12-31');
var date2 = new Date(date1);
date2.setDate(date2.getDate()-date1.getDate());
alert(date2)
根据setMonth
文档,'如果未指定[可选]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)
相关文章:
- JavaScript过期标头可以't设置为12个月
- 单击按钮以获取前 12 个斐波那契数的总和
- 减去2015-12-31的1个月得出2015-12-01
- Bootstrap列增加到12个,但仍在包装中
- JavaScript:打印前 12 个月 - “March”打印两次
- 删除错误.MongooDB + Express.传入的参数必须是 12 个字节的单个字符串或 24 个十六进制字符的字符
- 从 2015-08-01 获取日期“星期四”,这是来自日历
- 任意字符数的正则表达式不受限制,但应仅允许 12 个数字
- 如何从另一个长字符串创建最多 12 个字符的加密字符串
- 在Javascript中获得下一个12个月的结果是混乱的
- 如何在 html 的下拉列表中绑定过去 12 个月
- 不能发送超过 12 个单选按钮和表单操作邮件中的复选框选项
- 在 AngularJS 中设置具有动态路由和模板的 12 个产品页面的最佳方式
- 最近 12 个月在 Javascript 中
- 我如何采用两个日期选择器并使用我的开始和结束日期对数据进行排序,但 json 数据包含 5/12/2016,而角度仅排序
- 如何用JavaScript生成2015-12-23T15:17:52.000Z格式的日期/时间
- Date.parse("Nov-12-2015 12:41 PM") is null
- 为什么日期.UTC(2015, 08, 31) ==日期.javascript中的UTC(2015,09, 01)
- (new Date('2012-12-01')).getMonth() === 10?
- 获取当前日期和时间的javascript格式:2015-03-01 03:09:03