【问题标题】:Check if JavaScript string represents Date检查 JavaScript 字符串是否代表日期
【发布时间】:2017-05-30 13:33:17
【问题描述】:

我一直在检查字符串是否代表Date。目前我有一种情况需要检查"Tue May 16 2017 00:00:00 GMT+0400 (Georgian Standard Time)"这个字符串是否代表Date。我写了以下代码:

var tryConvert = new Date(input);
var tryMonth = tryConvert.getMonth();
if (!(tryMonth !== tryMonth)) {//checking for NaN
    return true;
}

问题是输入可以是整数96,它成功返回true。期望的行为是它应该只适用于Date 实例、ISO 字符串、/\d\d\d\d\-\d\d\-\d\dT\d\d\:\d\d\:\d\d/gDate.toString() 字符串,如"Tue May 16 2017 00:00:00 GMT+0400 (Georgian Standard Time)"。我怎样才能做到这一点?

为了更清楚,这里是完整的代码:

function isDate(input) {
    if (!input) {
        return false;
    }

    if (input instanceof Date) {
        return true;
    }

    var rx = /\d\d\d\d\-\d\d\-\d\dT\d\d\:\d\d\:\d\d/g;
    var time = rx.exec(input);

    if (time) {
        return true;
    }

    if (typeof input === 'string' || input instanceof String) {
        var tryConvert = new Date(input);
        var tryMonth = tryConvert.getMonth();
        if (!(tryMonth !== tryMonth)) {
            return true;
        }
    }

    return false;
};

【问题讨论】:

  • 使用那个正则表达式?
  • moment.js 是一个很好的日期处理库,它具有特定模式的解析方法。也许它可以帮助?
  • @SLaks,例如,不确定美国用户的 (new Date).toString() 会是什么。我怎样才能为它创建一个好的正则表达式?
  • date-fns.org 作为 momentjs 的替代品。

标签: javascript


【解决方案1】:

对于您的用例,将您的检查 input 是否是一个字符串与检查它是否是一个可解析的数字结合起来应该可以解决问题。

在这里我添加了这个检查,你检查input 是否是一个字符串:

if ((typeof input === 'string' || input instanceof String) && isNaN(input)) {
    var tryConvert = new Date(input);
    var tryMonth = tryConvert.getMonth();
    if (!(tryMonth !== tryMonth)) {
        return true;
    }
}

return false;

基本上,如果input 是包含965555 或任何其他可解析数字的字符串,则返回false,但实际日期字符串(例如Tue May 16 2017 00:00:00 GMT+0400 (Georgian Standard Time))不是可解析数字,因此它们将传递@987654329 @检查并进行转换测试。

您也可以删除 RegExp 测试,因为它只测试一种特定的日期格式。

【讨论】:

    猜你喜欢
    • 2020-06-23
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多