【问题标题】:Validate whether a date ia avalid date验证日期是否为有效日期
【发布时间】:2016-05-24 07:38:02
【问题描述】:

我正在尝试跨平台和浏览器验证日期是否为有效日期。

我尝试了以下方法,它在所有浏览器(IE5+、Firefox、Chrome)上都能正常运行:

isNaN(new Date())
--> false

isNaN(new Date(0))
--> false

isNaN(new Date("Fri May 20 2016 12:58:52 GMT+0530"))
--> false

isNaN(new Date("asd"))
--> true

前 3 个是有效日期,无论输出为 false,都表示日期有效。

请确认这是否正确。

PS:这个问题与日期格式无关。这个问题是关于确定日期是否是有效的 Javascript Date 对象。比如上面的试玩中new Date("asd")显然不是日期。

【问题讨论】:

  • 我不理解没有 cmets 的反对票,甚至是一次接近投票。

标签: javascript validation date datetime


【解决方案1】:

在您的代码中:

isNaN(new Date())
--> false

这里,new Date() 创建一个有效的新日期。 isNaN 然后在新创建的 Date 上调用 ToNumber,它会返回它的时间值,它不是 NaN,所以返回值是

isNaN(new Date(0))
--> false

这会创建一个时间值为 0 的有效日期(相当于 1970-01-01T00:00:00Z),它不是 NaN,因此返回 false。

isNaN(new Date("Fri May 20 2016 12:58:52 GMT+0530"))
--> false

这可能会或可能不会创建有效的 Date 对象,因为这取决于解析器的实现依赖行为来创建(或不)有效日期。所以返回true还是false是有问题的。

isNaN(new Date("asd"))
--> true

如上所述,获得预期结果取决于依赖于实现的解析器创建无效日期(尽管解析器很可能会创建无效日期)。

除了测试之外,您还可以随时阅读规范。它指出无效的 Date 对象的时间值为 NaN。因此,确定日期是否有效的可靠方法是检查时间值或任何 get 方法(getYear getMonth 等)。

以下任何一项都可以:

var d0 = new Date(NaN)  // Create an invalid date.
var d1 = new Date(2016) // Create a valid date

// Tests for invalid date
// Let isNaN coerce the date to Number
console.log(isNaN(d0) + ' : ' + isNaN(d1))
// Test the time value explicitly
console.log(isNaN(d0.getTime()) + ' : ' + isNaN(d1.getTime()));
// Use unary + to coerce the Date to Number
console.log(isNaN(+d0) + ' : ' + isNaN(+d1));
// Use a get method
console.log(isNaN(d0.getDate()) + ' : ' + isNaN(d1.getDate()));

// Not using isNaN - test the value returned by *toString*
console.log((d0.toString() == 'Invalid Date') + ' : ' + (d1.toString() == 'Invalid Date'));

最后一种方法不太可靠,因为 Date.prototype.toString 可以被覆盖并返回一些其他值(不是一个好主意或可能,但可能)。

【讨论】:

    【解决方案2】:

    Javascript 是进行跨浏览器日期验证的好方法。如果您能以正常的 dd/mm/yyyy 格式获取日期,这里有一个很好的正则表达式验证示例来检查日期字符串是否有效:-

        var theDate = '31/12/2016'
        var reg = /(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d/;
        return theDate.match(reg);
    

    希望这会有所帮助!

    【讨论】:

    • dd/mm/yyyy 不是“正常”格式,因为它取决于您的语言环境。 YYYY-MM-DDTHH:mm:ss.sssZ (ISO 8601) 更加标准。
    • @Steveo,这个问题与日期格式无关。这个问题是关于确定日期是否是有效的 Javascript Date 对象。
    • @C.Champagne——这不是关于“语言环境”,而是用户偏好。无论他们身在何处,美国人都可能希望看到 mm/dd/yyyy。 ISO 8601 是“标准得多”,因为它标准。 ;-)
    • @RobG 是 ISO-8601 标准。也许我应该写一些类似“是一个标准,因此更通用”的东西......我不知道......对不起使用 locale 这个词(我可能受到我的 java 背景的影响)但是我说的是参数化,而不是位置。见en.wikipedia.org/wiki/Locale_(computer_software)
    • @C.Champagne——使用“locale”而不是“preference”真的不是你的错,这个词已经被计算机行业滥用了一段时间。 “文化”曾经被使用过,但现在“语言环境”似乎很流行。 toLocaleString 方法应该被称为 toFormattedString,当然是 IMO。 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多