Moment: 调用 moment.utc("2016-07-01").year(2013).toString() 提供了错误的日期

创建于 2017-10-13  ·  4评论  ·  资料来源: moment/moment

问题描述和重现步骤:

似乎将日期设置为过去的日期然后将年份设置为任何内容都会将输出日期推到月底。

如果你打电话moment.utc("2016-07-01").year(2013).toString()你会得到Wed Jul 31 2013 00:00:00 GMT+0000 。 注意现在是 7 月 31 日而不是 7 月 1 日。

环境:

我已经在 Chrome 61 和 Node 5.10.1 中复制了这个

其他可能有用的信息:

如果您使用的是 2016 年的日期,这似乎只是一个问题。如果您尝试moment.utc("2015-07-01").year(2013).toString()它工作正常。

我可以确认这不是 2.19.0+ 之前的问题。 这只是 2.19.0+ 的问题

如果您要报告问题,请在您使用的环境中运行以下代码并包含输出:

console.log( (new Date()).toString())
console.log((new Date()).toLocaleString())
console.log( (new Date()).getTimezoneOffset())
console.log( navigator.userAgent)
console.log(moment.version)
Thu Oct 12 2017 23:10:36 GMT-0300 (ADT)
10/12/2017, 11:10:36 PM
180
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
2.19.1

最有用的评论

@HolgerFrank你介意提交一个 PR 来解决这个问题吗? 这是一个非常严重的错误,应该尽快修复..

编辑:我提交了 PR,等不及了。

所有4条评论

在 2.19.0 版本中,函数 set$1() 已更改。

由于这种变化,为闰年时刻设置新的一年,它总是将月份的最后一天设置为日期。

moment('2010-02-25').year(2017) // result is: 2017-02-28
moment('2010-10-15').year(2017) // result is: 2017-10-31

当前(不正确的)实现

function set$1 (mom, unit, value) {
    if (mom.isValid() && !isNaN(value)) {
        if (unit === 'FullYear' && isLeapYear(mom.year())) {
            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month()));
        }
        else {
            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
        }
    }
}

因为只有闰年的 2 月 29 日才需要特殊情况,所以正确的实现应该是:

function set$1 (mom, unit, value) {
    if (mom.isValid() && !isNaN(value)) {
        if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) {
            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, 1, daysInMonth(value, 1));
        }
        else {
            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
        }
    }
}

由于这是一个严重错误,因此应尽快更正。

抱歉刚刚注意到我写道“我可以确认这不是 1.19.0+ 之前的问题。这只是 1.19.0+ 的问题”但我实际上是指 2.19 ......我在原始帖子中更新了这个

@HolgerFrank你介意提交一个 PR 来解决这个问题吗? 这是一个非常严重的错误,应该尽快修复..

编辑:我提交了 PR,等不及了。

关闭有利于 PR。

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