尝试在moment.js中转换RFC2822日期时出现“弃用警告:瞬间构造回退到js日期”


164

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

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

但我得到:

弃用警告:构建时间回落到js日期。不鼓励这样做,并将在即将发布的主要版本中将其删除。请参阅https://github.com/moment/moment/issues/1407了解更多信息。

看来我不能摆脱它!我该如何解决?


您读过它说的那样吗?
toesslab 2014年

7
我当然读过!!但要么我很困惑,无法获取任何解决方案,要么根本没有任何解决方案!
dariush

在看了一点之后,这似乎是一个真实的问题,几个月前就进行了讨论...采用另一种工具...
toesslab 2014年

Answers:


315

要消除该警告,您需要执行以下任一操作:

  • 输入日期字符串的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')太不可预测了。


36
与引发此问题的令人困惑的消息相比,以上答案中项目符号中的任何文本都将提供更好的弃用警告消息。
2015年

2
可以moment((new Date('Thursday, November 12, 2015 11:59 PM').toISOSring());吗?还是我只是抑制一个准备在不久的将来像这样默默崩溃的问题?
Bruno Finger

如果传递的值包含前导或尾随多余字符(例如空格),则也可能会出现此消息。它通常带有Invalid日期结果。
Guillaume Renoult,2015年

@BrunoFinger应该起作用。Date()和toISOString()是JavaScript事物,不是Moment事物。
乔·威尔逊

如果您无法选择日期的提供方式,建议您使用第二个要点,即指定日期字符串的格式。它消除了最大的歧义。
约书亚·品特

50

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


对于TypeScript,您可能必须在此之前// @ts-ignore(至少对于某些类型的moment-timezone和@ types / moment-timezone)。
TrueWill

7

moment内部的日期构造在new Date()javascript中使用。该new Date()构造可在所有浏览器中以RFC2822ISO格式识别日期字符串。当构造一个moment日期不是这些格式对象时,将引发弃用警告。

尽管会引发弃用警告,但对于某些格式,moment将在Chrome中成功构建对象,但在Firefox或Safari中不会成功构建对象。因此,在Chrome中处理日期可能会得到预期的结果(并非总是如此)并抛出Invalid Date其他结果。

考虑, 02.02.2018

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

火狐浏览器- moment("02.02.2018")._d -->Invalid Date

苹果浏览器 - 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格式

moment("Thu, 01 Feb 2018 18:30:00 GMT")- RFC2822格式- 格式在Github上

  1. 如@niutech在先前答案中所建议,设置

moment.suppressDeprecationWarnings = true;

  1. 我建议暂时覆盖输入回退。

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

由于(3)将禁止所有警告,因此(4)将仅禁止日期构造回退。使用(4),您将获得Invalid Date内部new Date()使用,并且在控制台中可以看到其他弃用项,因此可以升级一下时刻,或者可以在应用程序中替换弃用的方法。


3

如果您的日期是通过API传递给您的string(例如我的问题),则可以使用过滤器将该字符串暂时转换为日期。这将解决临时施工警告。

$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'}}

0

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

为什么我会收到带有以下代码行的弃用消息。我认为应该使用String +格式来解决此问题。moment.tz('2015:08:20 14:33:20', 'YYYY:MM:DD HH:mm:ss', 'America/New_York')。另外,请不要让我无法控制所提供的日期格式。我知道自己可以将其转换为'YYYY-MM-DDTHH:mm:ss'不显示弃用消息。但是,根据文档,该行代码应该起作用。这是我看到的弃用消息。

“弃用警告:提供的值不是公认的RFC2822或ISO格式。此刻的构造应归结为js Date(),这在所有浏览器和版本中均不可靠。不建议使用非RFC2822 / ISO日期格式,并将以即将发布的主要版本。有关更多信息,请参阅 http://momentjs.com/guides/#/warnings/js-date/。”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.