【问题标题】:Moment.js deprecation warning when comparing two dates比较两个日期时的 Moment.js 弃用警告
【发布时间】:2017-11-03 19:14:54
【问题描述】:

我没有看到任何与我的用例匹配的 SO 线程。我正在尝试比较两个日期以查看它们是否匹配。如果他们不这样做,那么我会显示一条错误消息。两个日期的日期格式都是'MM/DD/YYYY' 格式,唯一的例外是有时它们可​​能是'MM/DD/YYYY',有时它们可​​能是'M/D/YYYY'

我能够让它工作,但不断收到一个已弃用的错误。我尝试使用 moment.ISO_8601 参数,但仍然收到已弃用的错误。

if( !moment( start_date, moment.ISO_8601 ).isSame( user_start_date, 
  moment.ISO_8601 ) )
{
    console.log("Both dates must match!");
}
else {
    console.log("Dates match!");
}

不推荐使用的错误如下:

moment.js:1 弃用警告:提供的值不是可识别的 RFC2822 或 ISO 格式。 moment 构造回退到 js Date(),这在所有浏览器和版本中并不可靠。不鼓励使用非 RFC2822/ISO 日期格式,并将在即将发布的主要版本中删除。


是否有一个干净的解决方法?

【问题讨论】:

    标签: javascript momentjs


    【解决方案1】:

    'MM/DD/YYYY''M/D/YYYY' 都不是moment.ISO_8601 识别的符合 ISO 8601 的格式,请参阅 moment(String) 文档以了解 momentjs 识别的 ISO 8601 格式是什么。您必须指定'MM/DD/YYYY'(或'M/D/YYYY')格式,而不是使用moment.ISO_8601

    您可以同时使用'MM/DD/YYYY''M/D/YYYY',使用moment(String, String[])。如果您使用的是strict parsing,则这是必需的。请注意:

    2.3.0 版本开始, Moment 使用一些简单的启发式方法来确定要使用的格式。顺序:

    • 优先使用导致valid 日期的格式而不是无效格式。
    • 更喜欢解析更多字符串而不是更少并且使用更多格式而不是更少的格式,即更喜欢更严格的解析。
    • 首选数组中较早的格式。

    例如,使用['MM/DD/YYYY', 'MM/DD/YYYY']01/10/2017 等不明确的输入将始终被解释为 1 月 10 日。

    这里是一个没有弃用警告的例子

    var start_date = '11/25/2017';
    var user_start_date = '27/12/2017';
    
    if( !moment( start_date, ['MM/DD/YYYY', 'M/D/YYYY']  ).isSame( moment(user_start_date, ['MM/DD/YYYY', 'M/D/YYYY'] )) )
    {
        console.log("Both dates must match!");
    }
    else{
        console.log("Dates match!");
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.1/moment.min.js"></script>

    【讨论】:

      【解决方案2】:

      我实际上没有看到这个问题。

      http://jsfiddle.net/dbkidd/n9s082bj/

      你能在 Fiddle 中重现它吗?

      var start_date = moment().format('MMM DD h:mm A');
      var user_start_date = moment().format('MMM DD h:mm A');
      
      if( !moment( start_date, moment.ISO_8601 ).isSame( user_start_date, 
        moment.ISO_8601 ) )
       {
         console.log("Both dates must match!");
       }
       else{
         console.log("Dates match!");
       }
      

      【讨论】:

      • 你是对的 - “弃用”警告不会出现在小提琴中。不过不知道为什么。我知道我下载了moment.js 的最新版本(实际上,单击moment.js 站点中的链接打开了js 文件,然后我将其复制到记事本中,并作为moment.js 保存到我的文件夹中)。我什至确保完全关闭 chrome 浏览器(以清除任何缓存),然后再试一次,但它仍然出现。我确实更新了 fiddle w/在我的应用程序中 console.log 时获得的日期值:jsfiddle.net/n9s082bj/2
      • @Dallas 'MMM DD h:mm A' 不是 ISO 8601 认可的格式,您的代码在某些环境中可能会抛出“弃用警告”。
      猜你喜欢
      • 2016-12-15
      • 2017-03-23
      • 2018-03-27
      • 2015-08-28
      • 2019-01-07
      • 2015-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多