Как отсортировать по дате с помощью плагина jquery DataTables?

Я использую плагин jquery datatables и хочу отсортировать по датам.

Я знаю, что у них есть плагин, но я не могу найти, где его на самом деле скачать

http://datatables.net/plug-ins/sorting

Я считаю, что мне нужен этот файл: dataTables.numericComma.js, но я нигде не могу его найти, и когда я загружаю таблицы данных, его нет в zip-файле.

Я также не уверен, нужно ли мне создавать собственный сортировщик дат для передачи в этот плагин.

Я пытаюсь отсортировать этот формат ММ / ДД / ГГГГ ЧЧ: ММ TT (AM | PM)

Спасибо

Изменить

Как я могу изменить это, чтобы отсортировать по ММ / ДД / ГГГГ ЧЧ: ММ TT (AM | PM) и изменить его на дату в США?

jQuery.fn.dataTableExt.oSort['uk_date-asc']  = function(a,b) {
    var ukDatea = a.split('/');
    var ukDateb = b.split('/');

    var x = (ukDatea[2] + ukDatea[1] + ukDatea[0]) * 1;
    var y = (ukDateb[2] + ukDateb[1] + ukDateb[0]) * 1;

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

jQuery.fn.dataTableExt.oSort['uk_date-desc'] = function(a,b) {
    var ukDatea = a.split('/');
    var ukDateb = b.split('/');

    var x = (ukDatea[2] + ukDatea[1] + ukDatea[0]) * 1;
    var y = (ukDateb[2] + ukDateb[1] + ukDateb[0]) * 1;

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

person chobo2    schedule 19.05.2010    source источник
comment
Просто хотел поблагодарить вас за этот код. На самом деле у меня были проблемы с сортировкой британских дат, и во многих потоках, которые я обнаружил, был код, который не работал, это работает, поэтому еще раз спасибо!   -  person 1DMF    schedule 07.07.2014
comment
Я знаю, что это очень старый вопрос, и ответы на него тоже старые. На момент написания этого комментария решение, предоставленное @RenRen, работает идеально и кажется наиболее чистым подходом.   -  person maxx777    schedule 02.12.2015


Ответы (13)


Нажмите ссылку «показать подробности» в разделе Дата (дд / мм / ГГГ), затем вы можете скопировать и вставить предоставленный там код плагина.


Обновление: я думаю, вы можете просто изменить порядок массива, например:

jQuery.fn.dataTableExt.oSort['us_date-asc']  = function(a,b) {
    var usDatea = a.split('/');
    var usDateb = b.split('/');

    var x = (usDatea[2] + usDatea[0] + usDatea[1]) * 1;
    var y = (usDateb[2] + usDateb[0] + usDateb[1]) * 1;

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

jQuery.fn.dataTableExt.oSort['us_date-desc'] = function(a,b) {
    var usDatea = a.split('/');
    var usDateb = b.split('/');

    var x = (usDatea[2] + usDatea[0] + usDatea[1]) * 1;
    var y = (usDateb[2] + usDateb[0] + usDateb[1]) * 1;

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

Все, что я сделал, это переключил __date_[1] (день) и __date_[0] (месяц) и заменил uk на us, чтобы вы не запутались. Я думаю, это должно позаботиться об этом за вас.


Обновление №2: вы должны иметь возможность просто использовать объект даты для сравнения. Попробуй это:

jQuery.fn.dataTableExt.oSort['us_date-asc']  = function(a,b) {
 var x = new Date(a),
     y = new Date(b);
 return ((x < y) ? -1 : ((x > y) ?  1 : 0));
};

jQuery.fn.dataTableExt.oSort['us_date-desc'] = function(a,b) {
 var x = new Date(a),
     y = new Date(b);
 return ((x < y) ? 1 : ((x > y) ?  -1 : 0));
};
person Mottie    schedule 19.05.2010
comment
Я проверю твой ответ через несколько минут. Я действительно использовал Tableorter до того, как переключился. Я переключился, потому что мне нужно было использовать плагин поиска, и из того, что я обнаружил, чрезвычайно сложно динамически добавлять строки в tableorter при использовании плагина поиска. - person chobo2; 19.05.2010
comment
Итак, как мне добавить к этому уравнению часы и минуты? - person chobo2; 19.05.2010
comment
Попробуйте мое новое обновление ... Не тестировал, но должно работать. - person Mottie; 20.05.2010

Сортировка по дате - со скрытым элементом

Преобразуйте дату в формат ГГГГММДД и добавьте к фактическому значению (ММ / ДД / ГГГГ) в <td>, заключите его в элемент, установите стиль display:none; для элементов . Теперь сортировка по дате будет работать как обычная. То же самое можно применить к сортировке по дате и времени.

HTML

<table id="data-table">
   <tr>
     <td><span>YYYYMMDD</span>MM/DD/YYYY</td>
   </tr>
</table>

CSS

#data-table span {
    display:none; 
}
person Anulal S    schedule 18.08.2014
comment
При экспорте в Excel эти скрытые элементы по-прежнему отображаются, fyi. - person Waxi; 04.01.2016
comment
@Anulal Рядом с YYYY есть дополнительный закрывающий тег. Исправьте код в своем ответе. - person Lucky; 09.05.2016
comment
Есть ли обходные пути, чтобы избежать создания YYYYMMDD в печати, Excel, PDF-файлах и т. Д.? - person Amit; 08.02.2017
comment
@amit Попробуйте с помощью медиа-запроса скрыть ГГГГММДД при печати <link rel="stylesheet" type="text/css" media="print" href="print-hide.css"> - person Anulal S; 13.02.2017
comment
У кого-нибудь есть решение для вопроса @waxi? У меня такая же проблема - person Shanmugapriyan; 01.08.2017
comment
Попробуйте клонировать и удалить эти скрытые узлы перед экспортом stackoverflow.com/questions/21239908/ - person Anulal S; 01.08.2017
comment
Этот метод не работает в Firefox, мой клиент любит firefox -.- - person John Christian De Chavez; 06.08.2018
comment
Вы можете скрыть столбцы с помощью кнопок ширины экспорта. СвойствоexportOptions.columns - person Duefectu; 24.12.2018

Вам следует использовать атрибуты данных HTML5. https://www.datatables.net/examples/advanced_init/html5-data-attributes.html

Просто добавьте элемент data-order в свой элемент td.
Плагины не требуются.

<table class="table" id="exampleTable">
    <thead>
        <tr>
            <th>Firstname</th>
            <th>Sign Up Date</th>
        </tr>
    </thead>

    <tbody>

        <tr>
            <td>Peter</td>
            <td data-order="2015-11-13 12:00">13. November 2015</td>
        </tr>
        <tr>
            <td>Daniel</td>
            <td data-order="2015-08-06 13:44">06. August 2015</td>
        </tr>
        <tr>
            <td>Michael</td>
            <td data-order="2015-10-14 16:12">14. October 2015</td>
        </tr>
    </tbody>
</table>


<script>
    $(document).ready(function() {
        $('#exampleTable').DataTable();
    });
</script>
person RenRen    schedule 06.11.2015
comment
Вы экономите мне день, работайте и на меня, это простой способ правильно отсортировать свидания! - person Stefan; 18.01.2016
comment
Применимо ли это к полям ID? - person Eli; 29.03.2016
comment
У меня есть данные в JSON через REST, поэтому я не могу контролировать разметку (я так думаю). Мои данные находятся внутри тега td, и я не могу добавлять атрибуты внутри td, как тогда его использовать? - person Krzysztof Morcinek; 13.05.2016
comment
@KrzysztofMorcinek Я сделал следующее: dams_table = $("#mySelection").DataTable({ createdRow: function(row, data, dataIndex) { $(row).find('td:eq(5)') .attr('data-sort', convertDate(data.lastinspection)) }, "autoWidth": false, "data": data, "columns": columns, "order": [5, "asc"], //order on sixth column "pagingType": "simple", //no page numbers "parseNumbers": true }); function convertDate(dateString) { return Date.parse(dateString); } но мои данные по-прежнему не сортируются изначально по этому атрибуту - person jtinsky; 16.05.2016
comment
Очень хороший код, без скриптов, но не забудьте указать одно значение для просмотра данных (в C # fecha_string = c.fecha.ToString("dd-MM-yyyy");) и одно значение для даты (в C # fechaStringOrder = c.fecha.ToString("yyyy-MM-dd");), а затем впереди: <td class="fechaControl" data-order="@item.fechaStringOrder">@item.fecha_string</td> - person Dani; 28.03.2017
comment
Это работает для начальной загрузки таблицы. Как только таблица загружена. Я не могу отсортировать его по возрастанию или убыванию. Столбец даты останется прежним. - person Lucky; 11.07.2017
comment
Отличное решение !!! @Dani в C # (+ razor) вы просто делаете вот так: ‹td [email protected]› @ string.Format ({0: dd-MM-yyyy hh: mm}, p.DatePublication) ‹ / тд › - person BigMan; 30.10.2017
comment
Большое спасибо за это решение, избегая дурацких плагинов :) - person Ignacio Ara; 13.08.2018
comment
Самое простое и лучшее решение, никаких дополнительных плагинов или скрытых полей не требуется. - person Themos; 05.10.2018
comment
Я думаю это правильный ответ - person Adam Kolkman; 01.02.2021
comment
Я просто хотел добавить свои 0,02 доллара и сказать, какой палочкой-выручалочкой этот код был. Я не знал, что этот атрибут существует. - person CF_HoneyBadger; 03.06.2021

Я понимаю, что это вопрос двухлетней давности, но я все же нашел его полезным. В итоге я использовал образец кода, предоставленный Fudgey, но с незначительной модификацией. Сэкономил мне время, спасибо!

jQuery.fn.dataTableExt.oSort['us_date-asc']  = function(a,b) { 
  var x = new Date($(a).text()),
  y = new Date($(b).text());
  return ((x < y) ? -1 : ((x > y) ?  1 : 0)); 
}; 

jQuery.fn.dataTableExt.oSort['us_date-desc'] = function(a,b) { 
  var x = new Date($(a).text()),
  y = new Date($(b).text());
  return ((x < y) ? 1 : ((x > y) ?  -1 : 0)); 
}; 
person Kevin    schedule 23.07.2012

По состоянию на 2015 год, наиболее удобный способ сортировки столбца даты в таблице данных - это использование требуемой сортировки плагин. Поскольку формат даты в моем случае был dd/mm/yyyy hh:mm:ss, в итоге я использовал плагин date-euro . Все, что нужно сделать, это:

Шаг 1. Включите плагин сортировки JavaScript файл или код и;

Шаг 2: Добавьте columnDefs, как показано ниже, для таргетинга на соответствующие столбцы.

$('#example').dataTable( {
    columnDefs: [
       { type: 'date-euro', targets: 0 }
    ]
});
person Vikram Deshmukh    schedule 16.04.2015
comment
* Обратите внимание, что этот подключаемый модуль * устарел. Подключаемый модуль * datetime обеспечивает расширенные * функциональные возможности и гибкость. - person Thiago C. S Ventura; 05.05.2015

Таблицы данных можно упорядочить только по DateTime в формате «ISO-8601», поэтому вам нужно преобразовать дату в «date-order» в этот формат (пример с использованием Razor):

<td data-sort="@myDate.ToString("o")">@myDate.ToShortDateString() - @myDate.ToShortTimeString()</td>
person Dani    schedule 24.11.2017

На всякий случай, если у кого-то возникнут проблемы с пустыми пробелами в значениях даты или в ячейках, вам придется обработать эти биты. Иногда пустое пространство не обрабатывается функцией обрезки, поступающей из html, это похоже на "$ nbsp;". Если вы не справитесь с этим, ваша сортировка не будет работать должным образом и сломается там, где есть пустое место.

Я также получил этот фрагмент кода из расширений jquery и немного изменил его в соответствии со своими требованиями. Вы должны сделать то же самое :) Ура!

function trim(str) {
    str = str.replace(/^\s+/, '');
    for (var i = str.length - 1; i >= 0; i--) {
        if (/\S/.test(str.charAt(i))) {
            str = str.substring(0, i + 1);
            break;
        }
    }
    return str;
}

jQuery.fn.dataTableExt.oSort['uk-date-time-asc'] = function(a, b) {
    if (trim(a) != '' && a!="&nbsp;") {
        if (a.indexOf(' ') == -1) {
            var frDatea = trim(a).split(' ');
            var frDatea2 = frDatea[0].split('/');
            var x = (frDatea2[2] + frDatea2[1] + frDatea2[0]) * 1;
        }
        else {
            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 = 10000000; // = l'an 1000 ...
    }

    if (trim(b) != '' && b!="&nbsp;") {
        if (b.indexOf(' ') == -1) {
            var frDateb = trim(b).split(' ');
            frDateb = frDateb[0].split('/');
            var y = (frDateb[2] + frDateb[1] + frDateb[0]) * 1;
        }
        else {
            var frDateb = trim(b).split(' ');
            var frTimeb = frDateb[1].split(':');
            frDateb = frDateb[0].split('/');
            var y = (frDateb[2] + frDateb[1] + frDateb[0] + frTimeb[0] + frTimeb[1] + frTimeb[2]) * 1;
        }
    } else {
        var y = 10000000;
    }
    var z = ((x < y) ? -1 : ((x > y) ? 1 : 0));
    return z;
};

jQuery.fn.dataTableExt.oSort['uk-date-time-desc'] = function(a, b) {
    if (trim(a) != '' && a!="&nbsp;") {
        if (a.indexOf(' ') == -1) {
            var frDatea = trim(a).split(' ');
            var frDatea2 = frDatea[0].split('/');
            var x = (frDatea2[2] + frDatea2[1] + frDatea2[0]) * 1;
        }
        else {
            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 = 10000000;
    }

    if (trim(b) != '' && b!="&nbsp;") {
        if (b.indexOf(' ') == -1) {
            var frDateb = trim(b).split(' ');
            frDateb = frDateb[0].split('/');
            var y = (frDateb[2] + frDateb[1] + frDateb[0]) * 1;
        }
        else {
            var frDateb = trim(b).split(' ');
            var frTimeb = frDateb[1].split(':');
            frDateb = frDateb[0].split('/');
            var y = (frDateb[2] + frDateb[1] + frDateb[0] + frTimeb[0] + frTimeb[1] + frTimeb[2]) * 1;
        }
    } else {
        var y = 10000000;
    }

    var z = ((x < y) ? 1 : ((x > y) ? -1 : 0));
    return z;
};
person Hali    schedule 11.04.2012

По поводу обновления №1 есть 2 проблемы:

  • Количество дней = 1 (д / ММ / ГГГГ) вместо (дд / ММ / ГГГГ)
  • Пустая дата

вот решение, чтобы избежать этих проблем:

jQuery.fn.dataTableExt.oSort['uk_date-asc'] = function (a, b) {
            var ukDatea = a.split('/');
            var ukDateb = b.split('/');

            //Date empty
             if (ukDatea[0] == "" || ukDateb[0] == "") return 1;

            //need to change Date (d/MM/YYYY) into Date (dd/MM/YYYY) 
            if(ukDatea[0]<10) ukDatea[0] = "0" + ukDatea[0]; 
            if(ukDateb[0]<10) ukDateb[0] = "0" + ukDateb[0];

            var x = (ukDatea[2] + ukDatea[1] + ukDatea[0]) * 1;
            var y = (ukDateb[2] + ukDateb[1] + ukDateb[0]) * 1;

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

        //Sorting by Date 
        jQuery.fn.dataTableExt.oSort['uk_date-desc'] = function (a, b) {
            var ukDatea = a.split('/');
            var ukDateb = b.split('/');

             //Date empty
             if (ukDatea[0] == "" || ukDateb[0] == "") return 1;

            //MANDATORY to change Date (d/MM/YYYY) into Date (dd/MM/YYYY) 
            if(ukDatea[0]<10) ukDatea[0] = "0" + ukDatea[0]; 
            if(ukDateb[0]<10) ukDateb[0] = "0" + ukDateb[0];

            var x = (ukDatea[2] + ukDatea[1] + ukDatea[0]) * 1;
            var y = (ukDateb[2] + ukDateb[1] + ukDateb[0]) * 1;

            return ((x < y) ? 1 : ((x > y) ? -1 : 0));
        };
person Giu    schedule 04.07.2012

Перейдите по ссылке https://datatables.net/blog/2014-12-18.

Очень простой способ упорядочить по дате.

<script type="text/javascript" charset="utf8" src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.8.4/moment.min.js"></script>
<script type="text/javascript" charset="utf8" src="https://cdn.datatables.net/plug-ins/1.10.19/sorting/datetime-moment.js"></script>

Вставьте этот код перед инициализацией таблицы данных:

$(document).ready(function () {
    // ......
    $.fn.dataTable.moment('DD-MMM-YY HH:mm:ss');
    $.fn.dataTable.moment('DD.MM.YYYY HH:mm:ss');
    // And any format you need
}
person Tigran    schedule 16.07.2019

Укажите type столбца как type: 'date':

{title: 'Expiration Date', data: 'ExpirationDate', type: 'date'}

person combatc2    schedule 11.12.2019

Создайте скрытый столбец «dateOrder» (например) с датой в виде строки в формате «yyyyMMddHHmmss» и используйте свойство «orderData», чтобы указать на этот столбец.

var myTable = $("#myTable").dataTable({
 columns: [
      { data: "id" },
      { data: "date", "orderData": 4 },
      { data: "name" },
      { data: "total" },
      { data: "dateOrder", visible: false }
 ] });
person Duefectu    schedule 02.01.2019

Я получил решение после целого дня работы над ним. Это небольшое хакерское решение. Добавлен диапазон внутри тега td.

<td><span><%= item.StartICDate %></span></td>. 

Формат даты, который я использую, - дд / ММ / ГГГГ. Проверено в Datatables1.9.0

person Shanmugapriyan    schedule 01.08.2017

У меня есть 10 столбцов в моей таблице, и есть 2 столбца с датами, 2-й столбец и 4-й столбец имеют дату США, так что это сработало для меня нормально. Просто вставьте этот код, наконец, в раздел сценария в той же последовательности.

   jQuery.fn.dataTableExt.oSort['us_date-asc'] = function (a, b) {
        var x = new Date(a),
            y = new Date(b);
        return ((x < y) ? -1 : ((x > y) ? 1 : 0));
    };


    jQuery.fn.dataTableExt.oSort['us_date-desc'] = function (a, b) {
        var x = new Date(a),
            y = new Date(b);
        return ((x < y) ? 1 : ((x > y) ? -1 : 0));
    };


    $('#tblPoSetupGrid').dataTable({
        columnDefs: [
            { type: 'us_date', targets: 3 },
            { type: 'us_date', targets: 1 }
        ]

    });
person Veer Jangid    schedule 21.09.2020