检查日期是否有效


124

以下是方案:

我有一个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 date对象被创建了两次。如何避免这种情况?有更好的解决方案吗?

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


不允许更改dateFormat的值吗?在这种情况下,您将必须更改输入的格式,因为2016-10-19为YYYY-MM-DD,而不是DD-MM-YYYY。您可以更改什么?
Pochen '16

输入来自日期选择器。也无法更改:(
Ganesh

1
请问为什么不允许您更改dateFormat变量?var d = moment(“ 19-10-2016”,“ DD-MM-YYYY”); 将解决你的问题,据我担心
Pochen

真的不能说。但这不是我控制的值。
Ganesh

Answers:


185

能够找到解决方案。由于我要获取的日期为ISO格式,因此只需提供当前日期即可对其进行验证,而无需传递dateFormat。

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

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


15
有谁知道当前首选的方法是什么?现在,此方法将引发以下“弃用警告”:瞬间构建回退到js Date。不鼓励这样做,并将在即将发布的主要版本中将其删除。请参阅github.com/moment/moment/issues/1407了解更多信息。
安德鲁(Andrew)


4
请注意,这并不总是有效:var a = moment('12345'); a.isValid() // is true这会失败,因为如果无法解析日期,那么moment将回退到默认的date对象。而默认的日期对象将始终返回日期(只是不是你想要的。)
Mauvis莱德福德

1
需要添加该内容moment('02').isValid() === true,因此您可能需要注意
Bruno Finger

3
另外moment('abcde 1').isValid() === true
Amiram Korach,


17

在这里,您可以开始:工作麻烦

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

就像我说的dateFormat是'DD-MM-YYYY'一样,我不允许更改它。
Ganesh

哦,我明白了。让我看看。
gschambial

可以在这里更改日期字符串2016-10-19吗?
gschambial

不。这来自日期选择器
Ganesh,2016年

1
在它从datepicker发出之后,再输入到它之前,您不能修改它var d = moment("2016-10-19",dateFormat);吗?
gschambial

14

我使用带有新日期的moment来处理undefined数据值的情况:

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

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

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



8

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


1
如果我们暂时将true作为第三个参数传递,它将检查确切的日期格式。
Raj Kumar N

2
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

您能在回答中添加一些解释吗?这对已经存在并被接受的答案有什么附加价值?
slfan '19

0

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

-2

试试这个。这不是很好,但是只要您的日期选择器的输入格式为常数,它就可以工作。

在此示例中,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
}

1
拜托,不要这样做。
tdelam
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.