有时我从javascript日期函数中获取无效日期

时间:2017-12-05 23:52:09

标签: javascript date parsing

真的不确定我在哪里出错了。

我有一些JavaScript按日期值对表进行排序:

function sortByDate() {
    if (jQuery("#web-orders .data-table tbody").length > 0) {
        var tbody = document.querySelector("#web-orders .data-table tbody");
        var rows = [].slice.call(tbody.querySelectorAll("tr"));
    }
    if (jQuery("#store-orders .data-table tbody").length > 0) {
        var tbodyStore = document.querySelector("#store-orders .data-table tbody");
        var rowsStore = [].slice.call(tbodyStore.querySelectorAll("tr"));

        rowsStore.forEach(function (entry) {
            rows.push(entry);
        });
    }

    rows.sort(function (a, b) {
        console.log("a.cells[2].innerHTML = " + a.cells[2].innerHTML);
        console.log("b.cells[2].innerHTML = " + b.cells[2].innerHTML);

        a = new Date(Date.parse(a.cells[2].innerHTML));
        b = new Date(Date.parse(b.cells[2].innerHTML));

        console.log("a = " + a);
        console.log("b = " + b);

        return a - b;
    });

    rows.forEach(function (v) {
        tbody.appendChild(v); // note that .appendChild() *moves* elements
    });
}

现在这里是一些带有无效日期的控制台输出:

a.cells[2].innerHTML = 28/11/2017 1:49:37 PM
b.cells[2].innerHTML = 5/09/2017 6:27:35 AM
a = Invalid Date
b = Tue May 09 2017 06:27:35 GMT+0930 (Cen. Australia Standard Time)
a.cells[2].innerHTML = 28/11/2017 1:49:37 PM
b.cells[2].innerHTML = 24/09/2017 6:12:48 PM
a = Invalid Date
b = Invalid Date

有谁知道为什么会这样?这让我很难过。

1 个答案:

答案 0 :(得分:3)

Date.parse使用RFC 2822格式,不允许指定自定义格式。但是,如果您的输入始终采用DD/MM/YYYY h:m:s AM/PM格式,那么您可以使用split自行进行解析并手动创建Date对象。

parseDate(a.cells[2].innerHTML);
parseDate(b.cells[2].innerHTML);

function parseDate(str) {
    // Split into date, time, and AM/PM
    var parts = str.split(" ");

    // Split and parse the day, month, and year
    var date = parts[0].split("/");
    var day = parseInt(date[0]);
    var month = parseInt(date[1]) - 1;
    var year = parseInt(date[2]);

    // Split and parse the hours, minutes, and seconds
    var time = parts[1].split(":");
    var hour = parseInt(time[0]);
    var minute = parseInt(time[1]);
    var second = parseInt(time[2]);

    // Add 12 hours to the time if it's in the afternoon
    if (parts[2] == "PM") { hour += 12; }

    // Build and return our Date object
    return new Date(year, month, day, hour, minute, second);
}

正如其他人所提到的,您也可以使用Moment来简化操作。