<p>moment.date($day).month($month).year($year) 的行为不同于 moment([$year, $month, $date])</p>

创建于 2015-11-02  ·  4评论  ·  资料来源: moment/moment

使用这两种 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 将通过添加适当的天数并在需要时倒带月份和年份来进行算术运算,这不是最佳实践,如果是抛出会更好)。

解决方案是始终按此顺序设置年、月、日、小时、分钟,以避免

所有4条评论

请注意,这

$('#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 很好; 让我们这样做。

此页面是否有帮助?
0 / 5 - 0 等级