检查日期是否合法。

208
以下是场景: 我有一个字符串日期和一个不同的日期格式。例如: 日期: 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的日期对象被创建了两次。我该如何避免这种情况?有更好的解决方案吗?

FYI,我不允许更改dateFormat


你不能改变dateFormat的值吗?如果是这样,你将不得不改变输入的格式,因为2016-10-19是YYYY-MM-DD,而不是DD-MM-YYYY。那么你可以改变什么呢? - Pochen
输入来自日期选择器。也不能改变它 :( - Ganesh
1
请问为什么您不能更改dateFormat变量?如果您使用var d = moment("19-10-2016", "DD-MM-YYYY");,就可以解决您的问题。 - Pochen
真的无法说。但我无法控制改变那个值。 - Ganesh
12个回答

272

我找到了解决方案。 由于日期是以ISO格式提供的,只需向moment提供日期即可验证它,无需传递dateFormat。

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

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


22
有人知道现在的首选方法是什么吗?该方法现在会出现“Deprecation Warning”:“moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.”。请参考链接获取更多信息。请注意,这种方式不鼓励使用,并将在未来的主要版本中移除。 - Andrew
11
提醒一下,这种方法并不总是可行:"var a = moment('12345'); a.isValid() // is true"。这种方法会失败,因为moment如果无法解析日期,它会退回到默认的日期对象。而默认的日期对象总是返回一个日期(只是不是你想要的那个日期)。 - Mauvis Ledford
5
需要补充一点,即 moment('02').isValid() === true,因此您可能需要小心处理。 - Bruno Finger
4
同时 moment('abcde 1').isValid() === true。(注:这句话的意思是,使用 JavaScript 库 Moment.js 中的函数 moment(),输入字符串 'abcde 1' 经过处理后被认为是合法的日期时间格式,返回值为 true。) - Amiram Korach
5
这个答案是错误的,因为无论我传入什么字符串,它总是返回 true。 - Billal Begueradj
显示剩余5条评论

166

3
这没有任何影响。 - Billal Begueradj
2
这是正确的答案……@Begueradj 这会产生影响,请尝试使用不同的值,有时是正确的,有时是错误的。 - Akki
1
你可以在这里阅读关于严格解析的内容:https://momentjs.com/guides/#/parsing/strict-mode/ - kuhr
1
这将允许您将0000输入为年份。 - eddy

49

我刚刚发现了一个非常混乱的案例。

moment('Decimal128', 'YYYY-MM-DD').isValid() // true

37
moment('Decimal128', 'YYYY-MM-DD', true).isValid() // false。请使用严格模式 :) https://momentjs.com/guides/#/parsing/strict-mode/ - jklemmack
1
严格模式有效。虽然这必须是严格的,但这很奇怪。 - Sam Araiza

24

如何使用 Moment 检查字符串是否为有效日期,即当日期和日期格式不同时

抱歉,但是本帖中提供的解决方案是否真正回答了所问的问题?

我有一个字符串日期和一个不同的日期格式。例如: date: 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 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()(如文档所述)只接受对象。在我看来,应该也支持字符串。


3
如果我们在 moment 的第三个参数中传入 true,它将检查精确的日期格式。 - Raj Kumar N

22

这是链接:Working Fidddle

$(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
4
在将日期从日期选择器输入到 var d = moment("2016-10-19",dateFormat); 之前,您能否修改它吗? - gschambial
显示剩余8条评论

19

我使用moment和new Date来处理undefined数据值的情况:

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

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

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


moment(new Date('Decimal128')).isValid() // truemoment(new Date('Decimal128')).isValid() // true - Predrag Stojadinović

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

2
你能否在你的回答中添加一些解释?这会为已有并被接受的答案增加什么额外的价值? - slfan

6
我使用的是moment.js。
let value = '19-05-1994';
let check = moment(value,'DD-MM-YYYY', true).isValid();
        console.log(check) //returns true
        return check

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

1

您可以使用

var d = moment("2016-10-19",dateFormat);
if(!isNaN(d)) {
  // d is a valid date.
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接