【问题标题】:Check if date is a valid one检查日期是否有效
【发布时间】:2017-02-28 15:25:18
【问题描述】:

以下是场景:

我有一个String 日期和不同的日期格式。例如:
日期:2016-10-19
日期格式:“DD-MM-YYYY”。

我需要检查这个日期是否有效。

我已经尝试过以下事情

var d = moment("2016-10-19",dateFormat);

d.isValid() 每次都返回false。 Moment.js 不解析给定格式的日期吗?

然后我尝试先将日期格式化为DD-MM-YYYY,然后将其传递给 Moment.js:

var d = moment("2016-10-19").format(dateFormat);
var date = moment(d, dateFormat);

现在date.isValid() 给了我想要的结果,但是这里 Moment.js 日期对象被创建了两次。我怎样才能避免这种情况?有没有更好的解决方案?

仅供参考,我不允许更改dateFormat

【问题讨论】:

  • 不允许更改dateFormat的值吗?在这种情况下,您将不得不更改输入的格式,因为 2016-10-19 是 YYYY-MM-DD,而不是 DD-MM-YYYY。你可以改变什么?
  • 输入来自日期选择器。也不能改变:(
  • 请问为什么不允许更改 dateFormat 变量? var d = moment("19-10-2016", "DD-MM-YYYY");就我而言,会解决你的问题
  • 真的不能说。但我无法控制更改该值。

标签: javascript date datetime momentjs


【解决方案1】:

能够找到解决方案。 由于我得到的日期是 ISO 格式,因此只提供日期到时刻将对其进行验证,无需传递 dateFormat。

var date = moment("2016-10-19");

然后date.isValid() 给出想要的结果。

【讨论】:

  • 有谁知道现在的首选方法是什么?此方法现在抛出以下“弃用警告”:时刻构造回退到 js 日期。这是不鼓励的,将在即将发布的主要版本中删除。更多信息请参考github.com/moment/moment/issues/1407
  • 提醒一下,这并不总是有效:var a = moment('12345'); a.isValid() // is true 这会失败,因为如果无法解析日期,moment 将退回到默认日期对象。并且默认日期对象将始终返回一个日期(只是不是您想要的。)
  • 需要添加moment('02').isValid() === true,所以你可能要小心
  • 还有moment('abcde 1').isValid() === true
  • 这是一个错误的答案,因为无论我传入什么字符串,我总是得到正确
【解决方案2】:

var date = moment('2016-10-19', 'DD-MM-YYYY', true);

您应该在调用 moment 时添加第三个参数,以强制执行严格的解析。这是 moment 文档的相关部分 http://momentjs.com/docs/#/parsing/string-format/ 它在该部分的末尾附近。

【讨论】:

  • 这没有效果。
  • 这个答案应该是正确的答案........@Begueradj 这有效果,尝试使用不同的值,有时正确有时错误
  • 你可以阅读关于严格解析here
  • 这会让你输入 0000 作为一年
【解决方案3】:

我刚刚发现了一个非常糟糕的案例。

moment('Decimal128', 'YYYY-MM-DD').isValid() // true

【讨论】:

【解决方案4】:

给你:Working Fidddle

$(function(){
  var dateFormat = 'DD-MM-YYYY';
  alert(moment(moment("2012-10-19").format(dateFormat),dateFormat,true).isValid());
});

【讨论】:

  • 就像我说的 dateFormat 是 'DD-MM-YYYY' 并且我不能更改它。
  • 哦,我明白了。让我看看。
  • 这里2016-10-19是否允许更改日期字符串?
  • 不。那来自日期选择器
  • 你不能在它来自datepicker之后,在你输入到var d = moment("2016-10-19",dateFormat);之前修改它吗?
【解决方案5】:

当日期和日期格式不同时,如何使用 Moment 检查字符串是否为有效日期

抱歉,此线程上的任何给定解决方案是否真正回答了所提出的问题?

我有一个字符串日期和一个不同的日期格式。前任。: 日期:2016-10-19 日期格式:“DD-MM-YYYY”。 我需要检查这个日期是否有效。

以下对我有用...

const date = '2016-10-19';
const dateFormat = 'DD-MM-YYYY';
const toDateFormat = moment(new Date(date)).format(dateFormat);
moment(toDateFormat, dateFormat, true).isValid();

// Note I: `new Date()` circumvents the warning that
//   Moment throws (https://momentjs.com/guides/#/warnings/js-date/),
//   but may not be optimal.

// Note II: passing `true` as third argument to `moment()` enables strict-mode
//   https://momentjs.com/guides/#/parsing/strict-mode/

但老实说,不明白为什么moment.isDate()(as documented) 只接受一个对象。在我看来也应该支持一个字符串。

【讨论】:

  • 如果我们暂时将 true 作为第三个参数传递,它会检查确切的日期格式。
【解决方案6】:

我使用 moment 和 new Date 来处理 undefined 数据值的情况:

const date = moment(new Date("2016-10-19"));

因为:moment(undefined).isValid() == true

哪里是更好的方法:moment(new Date(undefined)).isValid() == false

【讨论】:

    【解决方案7】:
    console.log(` moment('2019-09-01', 'YYYY-MM-DD').isValid()?  ` +moment('2019-09-01', 'YYYY-MM-DD').isValid())
    console.log(` moment('2019-22-01', 'YYYY-DD-MM').isValid()?  ` +moment('2019-22-01', 'YYYY-DD-MM').isValid())
    console.log(` moment('2019-22-22', 'YYYY-DD-MM').isValid()?  ` +moment('2019-22-22', 'YYYY-DD-MM').isValid())
    console.log(` moment('undefined', 'YYYY-DD-MM').isValid()?  ` +moment('undefined', 'YYYY-DD-MM').isValid())
    
     moment('2019-09-01', 'YYYY-MM-DD').isValid()?  true
     moment('2019-22-01', 'YYYY-DD-MM').isValid()?  true
     moment('2019-22-22', 'YYYY-DD-MM').isValid()?  false
     moment('undefined', 'YYYY-DD-MM').isValid()?  false
    

    【讨论】:

    • 您能否为您的答案添加一些解释?这对已经存在和接受的答案有什么附加价值?
    【解决方案8】:

    如果日期有效,则getTime() 将始终等于其自身。

    var date = new Date('2019-12-12');
    if(date.getTime() - date.getTime() === 0) {
        console.log('Date is valid');
    } else {
        console.log('Date is invalid');
    }
    

    【讨论】:

      【解决方案9】:

      我用的是moment.js

      let value = '19-05-1994';
      let check = moment(value,'DD-MM-YYYY', true).isValid();
              console.log(check) //returns true
              return check
      

      【讨论】:

        【解决方案10】:

        你可以使用

        var d = moment("2016-10-19",dateFormat);
        if(!isNaN(d)) {
          // d is a valid date.
        }
        

        【讨论】:

          【解决方案11】:

          试试这个。这不是很好,但只要输入是来自日期选择器的恒定格式,它就可以工作。

          在这个例子中是 badDate 来自你的选择器

          https://jsfiddle.net/xs8tvox9/

          var dateFormat = 'DD-MM-YYYY'
          var badDate = "2016-10-19";
          
          var splittedDate = badDate.split('-');
          
          if (splittedDate.length == 3) {
            var d = moment(splittedDate[2]+"-"+splittedDate[1]+"-"+splittedDate[0], dateFormat);
            alert(d.isValid())
          } else {
            //incorrectFormat
          }
          

          【讨论】:

          • 请不要这样做。
          猜你喜欢
          • 2012-03-15
          • 1970-01-01
          • 2013-01-09
          • 2020-01-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-15
          相关资源
          最近更新 更多