1

我有一个带有 aoColumnDefs 的数据表,其中包含:

{ "sType": "date-range", "aTargets": [0] }

此列中的日期是格式为“MM/dd/yyyy - MM/dd/yyyy”的字符串。不幸的是,此列当前排序不正确。不是按年、月、日排序,而是按月、日、年排序。

我假设这是一个日期格式问题(因为它是从左到右对日期部分进行排序,假设我的日期是 yyyy/mm/dd)。

有没有办法设置在数据表上对日期进行排序时使用的日期格式?

注意:我知道我可以对隐藏字段进行排序。这给我带来了其他问题,我想知道我是否可以通过其他方式解决问题。

4

1 回答 1

3

从这里开始:http: //datatables.net/development/sorting#type_based

要向 DataTables 添加新的排序函数,您需要将函数附加到对象 $.fn.dataTableExt.oSort。例如,以下添加了“string-case”类型的区分大小写的排序函数:

jQuery.fn.dataTableExt.oSort['date-range-asc']  = function(x,y) {
    //x = "MM/dd/yyyy - MM/dd/yyyy";
    var regex = /(\d{2}\/\d{2}\/\d{4})/,
        matchesX = regex.exec(x),
        matchesY = regex.exec(y);        

    //for example, only sort on first date..
    x = Date.parse(matchesX[0]);
    y = Date.parse(matchesY[0]);

    return ((x < y) ? -1 : ((x > y) ?  1 : 0));
};

上面的代码可能被破坏了......但它应该让你走上正轨

mtmurdock 的解决方案

将此代码添加到 site.js(或在数据表之后导入的任何位置):

jQuery.extend(jQuery.fn.dataTableExt.oSort, {
    "my-date-range-pre": function (a) {
        var ukDatea = a.split('/');

        var year = $.trim(ukDatea[2].split('-')[0]);
        var month = $.trim(ukDatea[0]);
        var day = $.trim(ukDatea[1]);

        if (month.length == 1)
            month = "0" + month;
        if (day.length == 1)
            day = "0" + day;

        return (year + month + day) * 1;
    },

    "my-date-range-asc": function (a, b) {
        var result = ((a < b) ? -1 : ((a > b) ? 1 : 0));
        return result;
    },

    "my-date-range-desc": function (a, b) {
        var result = ((a < b) ? 1 : ((a > b) ? -1 : 0));
        return result;
    }
});

然后在你的表定义上设置 aoColumnDefs 像这样:

{ "sType": "my-date-range", "aTargets": [0] }
于 2012-09-25T20:15:41.880 回答