弃用警告:时刻构建回落到日期

时间:2014-04-24 08:13:14

标签: javascript warnings deprecated momentjs

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

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

但我得到了:

  

弃用警告:时刻构建回落到日期。这是不鼓励的,将在即将发布的主要版本中删除。有关详细信息,请参阅https://github.com/moment/moment/issues/1407

似乎我无法摆脱它! 我该如何解决?

7 个答案:

答案 0 :(得分:278)

要摆脱警告,您需要:

  • 传入日期字符串的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')太难以预测了。

答案 1 :(得分:33)

作为替代方法,您可以通过设置moment.suppressDeprecationWarnings = true;

来禁止显示弃用警告

答案 2 :(得分:5)

moment中的日期构造在内部使用JavaScript中的new Date()new Date()结构可在所有浏览器中以RFC2822ISO格式识别日期字符串。当构造日期不属于这些格式的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格式

moment("Thu, 01 Feb 2018 18:30:00 GMT")-RFC2822格式-Format in 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 :(得分:2)

如果您的日期是通过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'}}

答案 4 :(得分: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/了解更多信息。”

答案 5 :(得分:0)

就我而言,我试图生成一个日期时间以将其包含在表单数据中。但是我可以访问的字符串格式看起来像是“ 2020年9月10日10:10”,因此在尝试使用类似此类的时刻时

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

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

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

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

结果:2020-09-10 10:10:00 就是这样,警告消失了,瞬间很开心,并且您准备好了持久的日期时间格式。

答案 6 :(得分:0)

Moment 的使用非常广泛,以至于随着时间的推移不可能弃用当前版本。查看此 post 有关替代选项的信息 从 moment.js 迁移