检查日期是否有效

情况如下:

我有一个 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

320766 次浏览

给你 工作小提琴

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

试试这个。这不是很好,但它将工作,只要输入是常量格式从您的日期选择器。

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

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
}

找到了解决办法。 因为我获得的日期是 ISO 格式的,所以只需提供日期即刻就可以验证它,不需要传递 dateFormat。

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

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

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

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

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

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

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

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

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

我刚发现了一个很糟糕的案子。

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

当日期和日期格式不同时,如何使用 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 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()(记录在案)只接受一个对象。应该也支持一个字符串在我看来。

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

你可以用

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

我用的是 Moment.js

let value = '19-05-1994';
let check = moment(value,'DD-MM-YYYY', true).isValid();
console.log(check) //returns true
return check
moment("2022-10-18 04:00 AM", "YYYY-MM-DD HH:mm AM", true).isValid()