使用这两种 setter 方法对日期进行不同的解析。
将日期设置为October 31, 2015
。 链式方法返回2015-10-01
而 init 方法返回2015-10-31
var year = 2015;
var month = 9; //october
var day = 31;
console.log(moment().date(day).month(month).year(year).format('YYYY-MM-DD'));
//2015-10-01
console.log(moment([year, month, day]).format('YYYY-MM-DD'));
//2015-10-31
JS小提琴: http :
请注意,这
$('#chained').val(moment().year(2015).month(9).date(31).format('YYYY-MM-DD'));
正确返回2015-10-31
事实上,moment 模仿了 JS 日期对象的行为。
首先,您创建moment()
为您提供当前日期(截至今天的 11 月 3 日)。 您尝试将其日期设置为31
但 11 月只有 30 天,因此 JS 本地日期对象“智能地”添加了一天并将日期移动到 12 月 1 日(您可以将日期设置为任何疯狂的数字,例如 42,并且 JS 将通过添加适当的天数并在需要时倒带月份和年份来进行算术运算,这不是最佳实践,如果是抛出会更好)。
解决方案是始终按此顺序设置年、月、日、小时、分钟,以避免
确实记录了关于溢出处理的事实:
http://momentjs.com/docs/#/get -set/date/
获取或设置月份中的日期。
接受 1 到 31 之间的数字。如果超出范围,它将冒泡到月份。
尽管像您这样的极端情况下的行为确实令人惊讶。
我在文档仓库中打开了一个 PR 解释了这个常见问题
https://github.com/moment/momentjs.com/pull/244
是的,我不确定这是否可以修复。 Moment 不知道你要设置月份,所以它试图设置当前月份的日期,它可能有也可能没有 31。它不知道你的意图。 我认为@jakub-g 的 doc PR 很好; 让我们这样做。
最有用的评论
请注意,这
正确返回
2015-10-31
事实上,moment 模仿了 JS 日期对象的行为。
首先,您创建
moment()
为您提供当前日期(截至今天的 11 月 3 日)。 您尝试将其日期设置为31
但 11 月只有 30 天,因此 JS 本地日期对象“智能地”添加了一天并将日期移动到 12 月 1 日(您可以将日期设置为任何疯狂的数字,例如 42,并且 JS 将通过添加适当的天数并在需要时倒带月份和年份来进行算术运算,这不是最佳实践,如果是抛出会更好)。解决方案是始终按此顺序设置年、月、日、小时、分钟,以避免