检查日期是不是有效
Posted
技术标签:
【中文标题】检查日期是不是有效【英文标题】: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");就我而言,会解决你的问题 真的不能说。但我无法控制更改该值。 How to test a string is valid date or not using moment?的可能重复 【参考方案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
【讨论】:
moment('Decimal128', 'YYYY-MM-DD', true).isValid() // false
。使用严格模式:) momentjs.com/guides/#/parsing/strict-mode
严格模式有效。奇怪的是,这必须是严格的。【参考方案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
【讨论】:
请不要这样做。以上是关于检查日期是不是有效的主要内容,如果未能解决你的问题,请参考以下文章