【问题标题】:Momentjs : How to prevent "Invalid date"?Momentjs:如何防止“无效日期”?
【发布时间】:2015-03-11 17:14:35
【问题描述】:

我有以下代码:

var fomattedDate = moment(myDate).format("L");

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

【问题讨论】:

    标签: javascript momentjs invalidation


    【解决方案1】:

    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") : "";
    

    ...如果日期无效,它将使用"" 作为end_date 字符串。

    详情

    这里发生了两件非常不同的事情。

    第一:

    0000-00-00T00:00:00 无效日期。一月之前没有月份(该格式中的第一个月),也没有第一天之前的一个月中的某一天。所以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));
    

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

    当然可以:format 返回一个字符串,而您正在使用 format 获取 end_date

    如果你想知道一个 MomentJS 对象是否有一个无效的日期,你可以这样检查:

    if (theMomentObject.isValid()) {
        // It has as valid date
    } else {
        // It doesn't
    }
    

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

    if (!isNaN(theDateObject)) {
        // It has as valid date
    } else {
        // It doesn't
    }
    

    ...因为isNaN 会将日期强制转换为其原始形式,即自 1970 年 1 月 1 日 00:00:00 GMT 以来的基本毫秒数,并且当日期具有“无效”日期时,数字它包含NaN。所以当日期无效时isNaN(theDateObject) 为真。

    【讨论】:

    • 返回""会抛出错误,返回null是安全的。
    • @Vaishak:这里的用例是字符串格式化,"" 不会神奇地抛出错误。
    • @T.J.Crowder 你能解释一下你在这里使用的jsonNC 是什么吗?
    • @John:见original question
    • @T.J.Crowder 谢谢,实际上我也面临同样的问题,并且像 if(moment(value_).isValid()){ return moment(value_).format('MM/DD/YYYY'); } else { return moment(""); 那样做,并在遇到 else 声明时得到 NaN。知道我做错了什么吗?
    猜你喜欢
    • 2019-04-29
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    相关资源
    最近更新 更多