Проблема сортировки даты с помощью Jquery Tablesorter - PullRequest
22 голосов
/ 10 ноября 2009

Я пытаюсь отсортировать таблицу с таким столбцом, как 2009-12-17 23:59:59.0.Я использую ниже, чтобы применить сортировку

$(document).ready(function() 
        { 
            $("#dataTable").tablesorter();  
        } 
    );

Но это не работает для дат в формате гггг-мм-дд.Кто-нибудь может подсказать, как я могу применить этот формат для сортировки?

Ответы [ 7 ]

36 голосов
/ 10 ноября 2009

Правильнее всего было бы добавить собственный синтаксический анализатор для этого пользовательского формата.

Отметьте это, чтобы понять, как это работает.

jQuery Tablesorter: добавьте свой собственный анализатор

Затем взгляните на источник таблиц (найдите uslongdate, shortdate, а затем посмотрите, как парсеры для форматов даты внутренне выполняются таблицами. Теперь создайте себе подобный синтаксический анализатор для вашего конкретного формата даты.

jquery.tablesorter.js

Это должно работать на ваше усмотрение

ts.addParser({
    id: "customDate",
    is: function(s) {
        //return false;
        //use the above line if you don't want table sorter to auto detected this parser
        //else use the below line.
        //attention: doesn't check for invalid stuff
        //2009-77-77 77:77:77.0 would also be matched
        //if that doesn't suit you alter the regex to be more restrictive
        return /\d{1,4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}\.\d+/.test(s);
    },
    format: function(s) {
        s = s.replace(/\-/g," ");
        s = s.replace(/:/g," ");
        s = s.replace(/\./g," ");
        s = s.split(" ");
        return $.tablesorter.formatFloat(new Date(s[0], s[1]-1, s[2], s[3], s[4], s[5]).getTime()+parseInt(s[6]));
    },
    type: "numeric"
});

Теперь просто примените его к столбцу, в котором у вас есть этот формат (например, предполагая, что столбец, в котором находятся ваши пользовательские даты, находится в столбце № 7. (6 означает столбец 7, потому что массив столбцов имеет нулевую основу)

$(function() {
    $("table").tablesorter({
        headers: {
            6: { sorter:'customDate' }
        }
    });
});
35 голосов
/ 26 ноября 2010

Сортировка по Великобритании / Европейскому формату даты дд / мм / гггг по:

$("#tableName").tablesorter({dateFormat: "uk"});
6 голосов
/ 01 июня 2010

Если вы используете формат даты / времени, например, мм / дд / гггг чч: мм, используйте ниже

$.tablesorter.addParser({ 
        id: "customDate",
        is: function(s) {
            //return false;
            //use the above line if you don't want table sorter to auto detected this parser                        
            //21/04/2010 03:54 is the used date/time format 
            return /\d{1,2}\/\d{1,2}\/\d{1,4} \d{1,2}:\d{1,2}/.test(s);
        },
        format: function(s) {
            s = s.replace(/\-/g," ");
            s = s.replace(/:/g," ");
            s = s.replace(/\./g," ");
            s = s.replace(/\//g," ");
            s = s.split(" ");                       
            return $.tablesorter.formatFloat(new Date(s[2], s[1]-1, s[0], s[3], s[4]).getTime());                                         
        },
        type: "numeric"} );
3 голосов
/ 12 февраля 2015

С последней версией 2.18.4 вы можете просто сделать это следующим образом. Просто укажите формат даты по умолчанию и в определенном столбце установите формат даты столбца, это будет работать ТОЛЬКО с сортировщиком «shortDate».

$('YourTable').tablesorter(
            {
                dateFormat:'mmddYYYY',
                headers: {
                    0: { sorter: false },
                    1: { sorter: true},
                    2: { sorter: true },
                    3: { sorter: true },
                    4: { sorter: "shortDate", dateFormat: "ddmmyyyy" },
                    5: { sorter: true },
                    6: { sorter: false },
                    7: { sorter: false },
                    8: { sorter: false },
                    9: { sorter: false },
                    10: { sorter: false },
                    11: { sorter: false }

                }
            });
0 голосов
/ 10 августа 2015

Просто добавьте другой вариант, который отлично подходит для сортировки даты ( дд / мм / гггг чч: мм: сс ) С помощью плагина js dataTables .

Добавьте код, указанный ниже, к вашему:

$(document).ready(function () {
oTable = $('#AjaxGrid').dataTable({
"aLengthMenu": [[5, 10, 25, 50, 100, 500,1000,-1], [5, 10, 25, 50, 100,500,1000,"All"]],
iDisplayLength: 1000,
aaSorting: [[2, 'asc']],
bSortable: true,
aoColumnDefs: [
{ "aTargets": [ 1 ], "bSortable": true },
{ "aTargets": [ 2 ], "bSortable": true },
{ "aTargets": [ 3 ], "bSortable": true },
{ "aTargets": [ 4 ], "bSortable": true },
{"aTargets": [ 5 ], "bSortable": true, "sType": "date-euro"},
{"aTargets": [ 6 ], "bSortable": true, "sType": "date-euro"},
{ "aTargets": [ 7 ], "bSortable": false }
],
"sDom": '<"H"Cfr>t<"F"ip>',
"oLanguage": {
"sZeroRecords": "- No Articles To Display -",
"sLengthMenu": "Display _MENU_ records per page",
"sInfo": " ", //"Displaying _START_ to _END_ of _TOTAL_ records",
"sInfoEmpty": " ", //"Showing 0 to 0 of 0 records",
"sInfoFiltered": "(filtered from _MAX_ total records)"
},
"bJQueryUI": true
});
});


//New code
jQuery.extend( jQuery.fn.dataTableExt.oSort, {
"date-euro-pre": function ( a ) {
if ($.trim(a) != '') {
var frDatea = $.trim(a).split(' ');
var frTimea = frDatea[1].split(':');
var frDatea2 = frDatea[0].split('/');
var x = (frDatea2[2] + frDatea2[1] + frDatea2[0] + frTimea[0] + frTimea[1] + frTimea[2]) * 1;
} else {
var x = 10000000000000; // = l'an 1000 ...
}

return x;
},

"date-euro-asc": function ( a, b ) {
return a - b;
},

"date-euro-desc": function ( a, b ) {
return b - a;
}
} );
0 голосов
/ 27 октября 2014

dateFormat: "mmddyyyy", // установить формат даты по умолчанию

пример-опции-дата-формат

0 голосов
/ 20 декабря 2012

Нет необходимости создавать новый парсер , просто используйте существующий с небольшими изменениями.

1. Откройте плагин Jquery js, где вы увидите скрипт ниже. Теперь просто измените формат даты (желаемый) для последнего, если в вашем случае это «yy-mm-dd».

    ts.addParser({
    id: "shortDate",
    is: function (s) {
        return /\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s);
    }, format: function (s, table) {
        var c = table.config;
        s = s.replace(/\-/g, "/");
        if (c.dateFormat == "us") {
            // reformat the string in ISO format
            s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$1/$2");
        } else if (c.dateFormat == "uk") {
            // reformat the string in ISO format
            s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$2/$1");
        } else if (c.dateFormat == "yy-mm-dd" || c.dateFormat == "dd-mm-yy") {
            s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/, "$1/$2/$3");
        }
        return $.tablesorter.formatFloat(new Date(s).getTime());
    }, type: "numeric"
});



2. Теперь выполните последний шаг, упомянутый джиттером, но с небольшими изменениями.

$(function() {
$("table").tablesorter({
    headers: {
        6: { sorter:'shortDate' }
    }
});
});
...