检查日期是不是有效

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

【讨论】:

请不要这样做。

以上是关于检查日期是不是有效的主要内容,如果未能解决你的问题,请参考以下文章

检查日期在 Typescript 中是不是有效?

检查日期是不是对选定的月份有效 Django 表单

在javascript中检查日期是不是有效[重复]

检查字符串是不是为日期的函数

接收字符串并使用 date-fns 验证它是不是是有效日期

Java中使用正则检查有效日期