以下是该场景:
我有一个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
。
答案 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)
对不起,但是此线程上的任何给定解决方案实际上都回答了所提出的问题吗?
我有一个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