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

Posted

技术标签:

【中文标题】尝试在 moment.js 中转换 RFC2822 日期时出现“弃用警告:时刻构造回退到 js 日期”【英文标题】:“Deprecation warning: moment construction falls back to js Date” when trying to convert RFC2822 date in moment.js 【发布时间】:2014-06-09 09:54:06 【问题描述】:

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

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

但我得到了:

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

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

【问题讨论】:

你读过它说这样做的地方吗? 我当然读了!!但要么我很困惑,无法获取任何解决方案,要么根本没有任何解决方案! 在那里看了一点,似乎是一个真正的问题,几个月前讨论过......换个工具...... 【参考方案1】:

要消除警告,您需要:

传入您的日期字符串的 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((new Date('Thursday, November 12, 2015 11:59 PM').toISOSring()); 好吗?还是我只是在压制一个问题,准备在不久的将来像这样默默地崩溃? 如果传递的值包含前导或尾随额外字符(例如空格),您也可能会收到此消息。它通常带有 Invalid 日期结果。 @BrunoFinger 应该可以工作。 Date() 和 toISOString() 是 JavaScript 的东西,而不是 Moment 的东西。 如果您无法选择如何提供日期,我建议您使用第二个要点,指定日期字符串的格式。它消除了最模糊的地方。【参考方案2】:

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

【讨论】:

对于 TypeScript,您可能必须在前面加上 // @ts-ignore(至少对于某些版本的时刻时区和 @types/时刻时区)。【参考方案3】:

moment 中的日期构造在内部使用 javascript 中的 new Date()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

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

因此,如果不使用推荐/标准格式,则使用 moment.js 的风险自负。

要取消弃用警告

    正如@Joe Wilson 在之前的回答中所建议的,在moment 构造中给出日期格式。

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

    以 ISO 或 RFC2822 格式给出日期。

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

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

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

moment.suppressDeprecationWarnings = true;

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

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

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

【讨论】:

【参考方案4】:

如果您的日期从 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'

【讨论】:

【参考方案5】:

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

为什么我会收到带有以下代码行的弃用消息。我认为 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/ 了解更多信息。”

【讨论】:

【参考方案6】:

就我而言,我试图生成一个日期时间以包含在我的表单数据中。但是我可以访问的字符串的格式看起来像“2020 年 9 月 10 日 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 就是这样,警告消失了,时刻很开心,您已经准备好持久化的日期时间格式。

【讨论】:

在回答已接受答案的旧问题(寻找绿色 ✓)以及其他答案时,请确保您的答案添加了新内容或对它们有帮助。因此,来自 Joe Wilson 的 accepted answer 声明 传入你现在拥有的字符串,但告诉 Moment 字符串在 中的格式基本上已经给出了相同的回答。【参考方案7】:

Moment 的使用范围如此广泛,以至于不可能随着时间的推移而弃用当前版本。看看这个post 的替代选项 Migrating away from moment.js

【讨论】:

以上是关于尝试在 moment.js 中转换 RFC2822 日期时出现“弃用警告:时刻构造回退到 js 日期”的主要内容,如果未能解决你的问题,请参考以下文章

将 Python 日期时间转换为 rfc 2822

如何在 moment.js 中绕过冬季时间的转换

在 JAVA 中解析 RFC 2822 日期

使用 Moment.js 将人类可读时间转换为 Unix 纪元时间

Unix时间戳的moment.js格式?

在 Java 中解析 RFC 2822 电子邮件地址