当试图在 Moment.js 中转换 RFC2822 Date 时,“ Depreation Police: moment construction fall back to js Date”

我将使用以下代码使用 Moment.js 将服务器端的日期时间转换为本地时间。

 moment(moment('Wed, 23 Apr 2014 09:54:51 +0000').format('lll')).fromNow()

但我得到的是:

废弃值警告: 瞬间建设回落到 js 日期。这是不鼓励的,并将在即将发布的主要版本中删除。详情请参阅 https://github.com/moment/moment/issues/1407

看来我摆脱不了它! 我该怎么办?

105437 次浏览

为了消除警告,你需要:

  • 传递日期字符串的 ISO 格式版本:

    moment('2014-04-23T09:54:51');

  • 传入你现在拥有的字符串,但是告诉 Moment 这个字符串是什么格式的:

    moment('Wed, 23 Apr 2014 09:54:51 +0000', 'ddd, DD MMM YYYY HH:mm:ss ZZ');

  • 将字符串转换为 JavaScript Date 对象,然后将其传递到 Moment:

    moment(new Date('Wed, 23 Apr 2014 09:54:51 +0000'));

最后一个选项是 Moment 目前支持的内置回退,带有不推荐的控制台警告。他们说在未来的版本中他们不会支持这种后退。他们解释说,使用 new Date('my date')是太不可预测的。

作为替代方法,您可以通过设置 moment.suppressDeprecationWarnings = true;来禁止显示弃用警告

如果您的日期是作为 string从 API 传递给您的(就像我的问题一样) ,您可以使用过滤器将字符串转换为日期。这样就可以解决施工警告的问题了。

$scope.apiDate = 10/29/2017 18:28:03";


angular.module('myApp').filter('stringToDate', function() {
return function(value) {
return Date.parse(value);
};
});

把它添加到视图中:

\{\{apiDate | stringToDate | amDateFormat:'ddd, MMM DD'}}

moment中的 date 构造在内部使用 javascript 中的 new Date()。在所有浏览器中,new Date()结构识别 RFC2822 < strong > ISO 格式的日期字符串。当构造日期不是这些格式的 moment对象时,将抛出弃用警告。

虽然抛出了弃用警告,但对于某些格式,moment对象将在 Chrome 中成功构建,而不是在 Firefox 或 Safari 中。由于这个原因,在 Chrome 中处理日期可能会得到预期的结果(并非总是如此) ,而在其他浏览器中抛出 Invalid Date

考虑一下 02.02.2018,

Chrome-moment("02.02.2018")._d-> Fri Feb 02 2018 00:00:00 GMT+0530 (India Standard Time)

Firefox-moment("02.02.2018")._d-> Invalid Date

Safari-moment("02.02.2018")._d-> Invalid Date

因此,如果不使用推荐/标准格式,使用 moment.js的风险由您自己承担。

为了禁止显示弃权警告 ,

  1. 正如@Joe Wilson 在前面的回答中所建议的那样,给出 moment结构的日期格式。

例子: moment("02.05.2018", "DD.MM.YYYY").format("DD MM YYYY");

  1. 以 ISO 或 RFC2822格式提供日期。

示例: moment("2018-02-01T18:30:00.000Z")-ISO 格式

RFC2822格式

  1. 正如@niutech 在之前的回答中所建议的,

moment.suppressDeprecationWarnings = true;

  1. 我建议立即覆盖输入备份。

     moment.createFromInputFallback=function (config){
    config._d = new Date(config._i);
    }
    

由于(3)将禁止所有警告,(4)将仅禁止日期构造回退。使用(4) ,您将获得 Invalid Date作为内部的 new Date()使用和其他弃权可以看到在控制台,所以瞬间可以升级或弃权的方法可以在应用程序中替换。

如上面的答案所示。提供日期格式应该可以。

为什么我会得到以下代码行的弃用消息。我认为 String + 格式可以解决这个问题。moment.tz('2015:08:20 14:33:20', 'YYYY:MM:DD HH:mm:ss', 'America/New_York').另外,请不要我没有控制的日期格式正在提供。我知道我可以把它自己转换成 'YYYY-MM-DDTHH:mm:ss'然后瞬间不显示弃权信息。但是,根据文档,代码行应该可以工作。这是我看到的反对信息。

”弃用警告: 提供的值不在可识别的 RFC2822或 Moment 构造回到 js Date () ,它不是 可靠的所有浏览器和版本。非 RFC2822/ISO 日期 格式是不鼓励的,并将在即将到来的专业删除 请参阅 Http://momentjs.com/guides/#/warnings/js-date/ 获取更多信息。”

在我的例子中,我试图生成一个日期时间来包含在表单数据中。但是我能够访问的字符串的格式看起来像“10-Sep-202010:10”,所以当试图使用

myDate = '10-Sep-2020 10:10';


moment(myDate).format('YYYY-MM-DD HH:mm:ss');

我收到了弃用警告。使用字符串创建日期没有问题,但是您只需要让 moment 知道您传递的是什么。例如,在显式声明它将要接收的格式时

moment(myDate, 'DD-MMM-YYYY HH:mm').format('YYYY-MM-DD HH:mm:ss');

结果: 2020-09-10 10:10:00 就是这样,警告消失了,时刻是快乐的,你有一个日期时间格式准备坚持。

Moment 的使用是如此广泛,以至于随着时间的推移不可能推翻当前的版本。看看这个 邮寄关于其他选项的文章,从 Moment.js 迁移