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

问题描述 投票:143回答:5

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

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

但我得到:

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

看来我无法摆脱它!我该如何解决?

javascript warnings deprecated momentjs
5个回答
287
投票

要摆脱警告,您需要:

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


32
投票

或者,您可以通过设置moment.suppressDeprecationWarnings = true;来禁止显示弃用警告


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
投票

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

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/。“

© www.soinside.com 2019 - 2024. All rights reserved.