检查日期是否有效

Gan*_*esh 104 javascript datetime date momentjs

以下是场景:

我有一个不同的String日期和日期格式.例:
日期:2016-10-19
dateFormat:"DD-MM-YYYY".

我需要检查这个日期是否有效.

我试过以下事情

var d = moment("2016-10-19",dateFormat);
Run Code Online (Sandbox Code Playgroud)

d.isValid()false每次都会回来.Moment.js是否以给定格式解析日期?

然后我尝试DD-MM-YYYY先将日期格式化,然后将其传递给Moment.js:

var d = moment("2016-10-19").format(dateFormat);
var date = moment(d, dateFormat);
Run Code Online (Sandbox Code Playgroud)

现在date.isValid()给我想要的结果,但是这里Moment.js日期对象被创建了两次.我怎么能避免这个?有更好的解决方案吗?

仅供参考我不允许改变dateFormat.

Gan*_*esh 160

能够找到解决方案.由于我得到的日期是ISO格式,只提供日期到时间将验证它,不需要传递dateFormat.

var date = moment("2016-10-19");
Run Code Online (Sandbox Code Playgroud)

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

  • 有谁知道现在的首选方法是什么?此方法现在抛出以下"弃用警告":时刻构造回落到js Date.这是不鼓励的,将在即将发布的主要版本中删除.有关详细信息,请参阅https://github.com/moment/moment/issues/1407. (11认同)
  • 请注意,这并不总是有效:`var a = moment('12345'); a.isValid()//是true`之所以失败,是因为如果无法解析日期,那一刻将回退到默认的日期对象。默认日期对象将始终返回一个日期(不是您想要的日期)。 (4认同)
  • 还有`moment('abcde 1').isValid() === true` (3认同)
  • 需要添加`moment('02').isValid() === true`,所以你可能要小心 (2认同)
  • 这是一个错误的答案,因为无论我传入什么字符串,我总是得到 true (2认同)

小智 98

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

您应该在调用时添加第三个参数moment来强制执行严格的解析.以下是当前文档的相关部分http://momentjs.com/docs/#/parsing/string-format/它接近本节末尾.

  • 这没有效果。 (3认同)
  • 这个答案应该是正确的答案........@Begueradj 这有效果,尝试使用不同的值,有时正确,有时错误 (2认同)

Sam*_*iza 21

我刚刚发现了一个非常糟糕的案例。

moment('Decimal128', 'YYYY-MM-DD').isValid() // true
Run Code Online (Sandbox Code Playgroud)

  • `moment('Decimal128', 'YYYY-MM-DD', true).isValid() // false`. 使用严格模式:) https://momentjs.com/guides/#/parsing/strict-mode/ (22认同)

tfm*_*gue 17

当日期和日期格式不同时,如何使用 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: `new Date()` circumvents the warning that
// Moment throws (https://momentjs.com/guides/#/warnings/js-date/),
// but may not be optimal.
Run Code Online (Sandbox Code Playgroud)

但老实说,不明白为什么moment.isDate()如文档所述)只接受一个对象。我认为还应该支持字符串。

  • 如果我们暂时将 true 作为第三个参数传递,它会检查确切的日期格式。 (2认同)

gsc*_*ial 16

你走了:工作小提琴

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

  • 在它来自 datepicker 之后和将它输入到 `var d = moment("2016-10-19",dateFormat);` 之前,你不能修改它吗? (3认同)

wak*_*poj 13

我将moment和新的Date一起使用来处理undefined数据值的情况:

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

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

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


小智 8

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
Run Code Online (Sandbox Code Playgroud)

  • 您能在您的答案中添加一些解释吗?这会给已经存在并被接受的答案增加什么附加价值? (2认同)

小智 6

我用的是moment.js

let value = '19-05-1994';
let check = moment(value,'DD-MM-YYYY', true).isValid();
        console.log(check) //returns true
        return check
Run Code Online (Sandbox Code Playgroud)