代码之家  ›  专栏  ›  技术社区  ›  Hacker

无效日期在IE中不返回为无效[重复]

  •  0
  • Hacker  · 技术社区  · 6 年前

    我正在使用浏览器日期功能。我输入了13/77/7777,这是一个无效的日期。我确实喜欢

    new Date('13/77/7777').getTime();
    

    1 回复  |  直到 6 年前
        1
  •  1
  •   pete    6 年前

    我得到的价值 .getTime() 在IE11中是 183289406400000 .
    日期本身返回为 March 18, 7778 .

    13/77/7777 在里面 mm/dd/yyyy 格式化并得出“7777年的第13个月和第77天”的结果,该结果(令人沮丧但并不意外)适用于 7778年3月18日 (如果您将13个月77天添加到 January 1, 7777 ).

    考虑到google的快速搜索没有发现 Date

    有一点要注意的是,虽然它可能没有它可能的效率(或准确度)那么高,但它应该作为一个合理的例子来帮助你开始。像这样的事情应该可以:

    function isValidDateString(s) {
        "use strict";
    
        if (typeof s !== "string") {
            return false; // not a string, exit.
        }
    
        var parts = s.split("/");
    
        if (parts.length !== 3) {
            return false; // unexpected number of slashes. exit.
        }
    
        var d31 = [1, 3, 5, 7, 8, 10, 12];
        var d30 = [4, 6, 9, 11];
    
        var mm = parseInt(parts[0]);
        var dd = parseInt(parts[1]);
        var yyyy = parseInt(parts[2]);
    
        // empirical testing in Chrome & IE11 to get this value. YMMV.
        var maxYear = 275760;
    
        var isValidYear = !isNaN(yyyy) && yyyy <= maxYear;
    
        var isDivisbleBy4 = (yyyy % 4 === 0);
        var isDivisbleBy100 = (yyyy % 100 === 0);
        var isDivisbleBy400 = (yyyy % 400 === 0);
        var isLeapYear = (isDivisbleBy4 && !isDivisbleBy100) || isDivisbleBy400;
    
        var isValidMonth = !isNaN(mm) && (mm >= 1 && mm <= 12);
        if (!isValidMonth) {
            return false;
        }
    
        var maxDaysInMonth = 28;
    
        if (d31.indexOf(mm) > -1) {
            maxDaysInMonth = 31;
        } else if (d30.indexOf(mm) > -1) {
            maxDaysInMonth = 30;
        } else if (isLeapYear) {
            maxDaysInMonth = 29;
        }
    
        var isValidDay = !isNaN(dd) && (dd > 0 && dd <= maxDaysInMonth);
        if (!isValidDay) {
            return false;
        }
    
        return isValidMonth && isValidDay && isValidYear;
    }
    
    var testsThatShouldFail = [
        '13/77/7777', // lousy Smarch weather!
        '2/29/2018',
        '9/12/275761',
        '4/31/2016',
        '6/35/2019',
    ];
    
    var testsThatShouldPass = [
        '1/1/1900',
        '2/29/2000',
        '2/29/2016',
        '9/12/275760',
        '8/16/2018',
    ];
    
    console.log('should fail', testsThatShouldFail.map(isValidDateString));
    console.log('should pass', testsThatShouldPass.map(isValidDateString));