Javascript “;弃用警告:当构造返回到js日期时”;尝试在moment.js中转换RFC2822日期时

Javascript “;弃用警告:当构造返回到js日期时”;尝试在moment.js中转换RFC2822日期时,javascript,date,momentjs,Javascript,Date,Momentjs,我使用下面的代码使用moment.js将服务器端日期时间转换为本地时间 moment(moment('Wed, 23 Apr 2014 09:54:51 +0000').format('lll')).fromNow() 但我得到了: 弃用警告:当构造返回到js日期时。这是不鼓励的,将在即将发布的主要版本中删除。有关更多信息,请参阅 看来我无法摆脱它!如何修复它?要消除警告,您需要: 传入日期字符串的ISO格式版本: 力矩('2014-04-23T09:54:51') 传递您现在拥有的字符串

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

 moment(moment('Wed, 23 Apr 2014 09:54:51 +0000').format('lll')).fromNow()
但我得到了:

弃用警告:当构造返回到js日期时。这是不鼓励的,将在即将发布的主要版本中删除。有关更多信息,请参阅


看来我无法摆脱它!如何修复它?

要消除警告,您需要:

  • 传入日期字符串的ISO格式版本:

    力矩('2014-04-23T09:54:51')

  • 传递您现在拥有的字符串,但告诉矩字符串的格式:

    时刻('Wed,Apr 2014 09:54:51+0000','ddd,DD-MMM-yyy-HH:mm:ss-ZZ')

  • 将字符串转换为JavaScript日期对象,然后将其传递到时刻:

    时刻(新日期('2014年4月23日星期三09:54:51+0000')


最后一个选项是Moment目前支持的内置回退,带有不推荐使用的控制台警告。他们说他们在未来的版本中将不支持这种回退。他们解释说,使用
新日期(“我的日期”)
太不可预测了。

作为替代方法,您可以通过设置
矩来禁止显示弃用警告。suppressDeprecationWarnings=true

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

moment
中的日期构造在内部使用javascript中的
new date()
new Date()
结构可以在所有浏览器中识别或格式的日期字符串。当构造日期不是这些格式的
moment
对象时,会抛出弃用警告

虽然会抛出弃用警告,但对于某些格式,Chrome中会成功构建
moment
对象,但Firefox或Safari中不会。因此,在Chrome中处理日期可能会产生预期的结果(并非始终如此),并在其他浏览器中抛出无效日期

考虑,
2018年2月2日

Chrome—
时刻(“2018年2月2日”)。\u d
->
2018年2月2日星期五00:00:00 GMT+0530(印度标准时间)

Firefox-
时刻(“2018年2月2日”)。\u d
->
无效日期

Safari—
时刻(“2018年2月2日”)。\u d
->
无效日期

因此,如果不使用推荐的/标准格式,则使用
moment.js
的风险由您自己承担

要抑制弃用警告,请执行以下操作:

  • 正如@Joe Wilson在前面的回答中所建议的,给出
    时刻
    施工的日期格式
  • 示例:
    力矩(“2018年5月2日”,“年月日”)。格式(“年月日”)

  • 以ISO或RFC2822格式给出日期
  • 示例:
    力矩(“2018-02-01T18:30:00.000Z”)
    -ISO格式

    时刻(“2018年2月1日星期四18:30:00 GMT”)
    -RFC2822格式-

  • 正如@niutech在前面的回答中所建议的,设置
  • moment.suppressDepressionWarnings=true

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

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

  • 由于(3)将抑制所有警告,(4)将仅抑制日期构造回退。使用(4),您将获得
    无效日期
    ,因为使用了内部
    新日期()
    ,并且可以在控制台中看到其他不推荐使用的日期,因此可以升级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日期 不鼓励使用格式,并将在即将到来的专业考试中删除 释放。请参阅 有关详细信息,请参阅。“


    在我的例子中,我试图生成一个日期时间来包含在表单数据中。但是我可以访问的字符串格式看起来像“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的使用如此广泛,以至于不可能随着时间的推移而弃用当前版本。在从moment.js迁移的其他选项上查看这篇文章

    你读过它的说明吗?我当然读过!!但要么我很困惑,找不到任何解决方案,要么根本就没有任何解决方案!在这里读了一点之后,这似乎是一个真正的问题,几个月前就讨论过了……使用另一个工具……上述答案中项目符号中的任何文本都会比开始这个问题的令人困惑的文本发出更好的弃用警告信息。正在使用
    moment((新日期('2015年11月12日星期四11:59 PM')。toISOSring())
    ok?还是am