Momentjs:如何防止"无效日期"?

R3t*_*tep 19 javascript invalidation momentjs

我有以下代码:

var fomattedDate = moment(myDate).format("L");
Run Code Online (Sandbox Code Playgroud)

有时moment(myDate).format("L")返回"无效日期",我想知道是否有办法防止这种情况并返回一个空字符串.

T.J*_*der 27

TL; DR

如果您的目标是确定您是否有有效日期,请使用Moment isValid:

var end_date_moment, end_date;
jsonNC.end_date = jsonNC.end_date.replace(" ", "T");
end_date_moment = moment(jsonNC.end_date);
end_date = end_date_moment.isValid() ? end_date_moment.format("L") : "";
Run Code Online (Sandbox Code Playgroud)

... 如果日期无效,将""用于end_date字符串.

细节

这里有两件非常不同的事情.

第一:

0000-00-00T00:00:00 无效的日期.1月之前没有月份(也就是那种格式的第1个月),也不是第1天之前的一个月.所以0000-00-00毫无意义.

0000-01-01T00:00:00是有效的 - 并moment("0000-01-01T00:00:00").format("L")乐意回报"01/01/0000"它.

如果您使用有效日期(例如您的2015-01-01T00:00:00示例),代码就可以了.

第二:

console.log(Object.prototype.toString.call(end_date));
Run Code Online (Sandbox Code Playgroud)

即使使用有效日期,它也会返回[object String],因此if条件在我的情况下不起作用.

当然有:format返回一个字符串,并且正在使用format得到end_date.

如果您想知道MomentJS对象是否具有无效日期,您可以这样检查:

if (theMomentObject.isValid()) {
    // It has as valid date
} else {
    // It doesn't
}
Run Code Online (Sandbox Code Playgroud)

如果您想知道Date对象是否具有无效日期:

if (!isNaN(theDateObject)) {
    // It has as valid date
} else {
    // It doesn't
}
Run Code Online (Sandbox Code Playgroud)

...因为isNaN将日期强制转换为原始形式,这是自格林威治标准时间1970年1月1日00:00:00以来的基础毫秒数,当日期具有"无效"日期时,它包含的数字是NaN.所以,isNaN(theDateObject)当日期是无效的也是如此.

  • @Vaishak:这里的用例是字符串格式,``"`不会神奇地抛出错误. (3认同)