检查日期是否有效

时间:2016-10-19 06:26:26

标签: javascript date datetime momentjs

以下是该场景:

我有一个String日期和一个不同的日期格式。例:
日期:2016-10-19
dateFormat:“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

9 个答案:

答案 0 :(得分:124)

能够找到解决方案。 由于我得到的日期是ISO格式,只提供日期到时间将验证它,不需要传递dateFormat。

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

然后date.isValid()给出了期望的结果。

答案 1 :(得分:84)

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

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

答案 2 :(得分:13)

在这里:Working Fidddle

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

答案 3 :(得分:9)

我将矩和新的日期一起使用来处理undefined数据值的情况:

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

由于以下原因:moment(undefined).isValid() == true

其中最好的方法是:moment(new Date(undefined)).isValid() == false

答案 4 :(得分:1)

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

对不起,但是此线程上的任何给定解决方案实际上都回答了所提出的问题吗?

  

我有一个String日期和一个不同的日期格式。例如:   日期:2016-10-19   dateFormat:“ 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: `new Date()` circumvents the warning that
// Moment throws (https://momentjs.com/guides/#/warnings/js-date/),
// but may not be optimal.

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

答案 5 :(得分:1)

如果日期有效,则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');
}

答案 6 :(得分:0)

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

答案 7 :(得分:-1)

试试这个。它并不好,但只要输入是日期选择器的常量格式,它就会起作用。

在这个例子中来自你的选择器的是坏日期

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
}

答案 8 :(得分:-2)

我刚刚发现一个非常混乱的案子。

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