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

数据表:对日期范围列进行排序

  •  1
  • mtmurdock  · 技术社区  · 12 年前

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

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

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

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

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

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

    1 回复  |  直到 12 年前
        1
  •  3
  •   mtmurdock    12 年前

    从这里开始: 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));
    };
    

    上面的代码可能已损坏。。。但它应该让你走上正轨

    默多克的解决方案

    将此代码添加到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] }