繁体   English   中英

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

[英]“Deprecation warning: moment construction falls back to js Date” when trying to convert RFC2822 date in moment.js

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

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

但我得到:

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

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

要消除警告,您需要:

  • 传入日期字符串的 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 日期对象,然后将其传递给 Moment:

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

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

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

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 格式 - Github 中的格式

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

moment.suppressDeprecationWarnings = true;

  1. 我建议立即覆盖输入回退。

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

由于 (3) 将抑制所有警告,(4) 将仅抑制日期构造回退。 使用(4),你会得到Invalid Date因为使用了内部new Date()并且在控制台中可以看到其他弃用,因此可以升级 moment 或可以在应用程序中替换弃用的方法。

如果您的日期作为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'}}

如上述答案所示。 提供日期格式应该有效。

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

“弃用警告:提供的值不是公认的 RFC2822 或 ISO 格式。时刻构造回退到 js Date(),这在所有浏览器和版本中都不可靠。不鼓励使用非 RFC2822/ISO 日期格式,并将在即将发布的主要版本。请参阅http://momentjs.com/guides/#/warnings/js-date/了解更多信息。”

就我而言,我试图生成一个日期时间以包含在我的表单数据中。 但是我可以访问的字符串格式看起来像“10-Sep-2020 10: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 迁移

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM