Как отсортировать по времени (формат: 5:40 вечера) в JavaScript для использования с DataTables? - PullRequest
1 голос
/ 06 января 2012

У меня есть дата, которую я использую, которая имеет 5 столбцов (http://datatables.net/)

Столбцы

  1. Дата в формате: 5 января
  2. Время в формате: 10:31 (xx: xx XX)
  3. Столбцы 3, 4, 5 не важны, это просто данные, которые меня не волнуют, пока сортировкакак 1 и 2 верны.

Я хочу отсортировать по дате ПЕРВЫЙ (самый последний), затем я хочу отсортировать по времени (самый последний вверху).

Итак, 5 января, 16:58покажите до 4:58 утра, и, очевидно, все остальные числа должны работать и для всех остальных времен.Формат всегда один и тот же, то есть: 12:34, 16:15, 12:00 и т. Д.

Для даты это уже отлично работает.В данных содержится максимум 2 дня данных, поэтому, даже если они перенесены на 1-е число месяца, они все равно будут отображаться в верхней части, что нормально.Я посмотрел на документацию, и я запутался, как сделать правильную сортировку для моего столбца Time.

Вот мой код:

oTable = $('#posts').dataTable({
    "bSort": true,
    "aaSorting": [ [0,'desc'], [1,'asc'] ],
    "aoColumns": [
                null,
                { "sType": 'time-sort' },
                null,
                null,
                null
           ]

});

Это отсюда: http://datatables.net/release-datatables/examples/basic_init/multi_col_sort.html

Я так понимаю, теперь мне нужно создать какой-то собственный алгоритм сортировки по времени, используя свойство sType для "aoColumns" (вы можете увидеть это в приведенной выше ссылке на пример, где он чутко сортирует регистр), и у меня естьнулевая идея, как это сделать :( Я даже не совсем уверен, правильно ли я все сделал до сих пор. Кажется, что две колонки нормально сортируются, но теперь мне нужно сделать так, чтобы настало время ...

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

/* Define two custom functions (asc and desc) for time sorting */
jQuery.fn.dataTableExt.oSort['time-sort-asc']  = function(x,y) {
    return ???;
};

jQuery.fn.dataTableExt.oSort['time-sort-desc'] = function(x,y) {
    return ???
};

Ответы [ 3 ]

3 голосов
/ 06 января 2012

Вы можете сделать это, проанализировав время из вашей входной строки в объект даты и затем сравнив объекты даты:

Рабочая демонстрация здесь: http://live.datatables.net/erefom/2/edit#preview

Источник здесь: http://live.datatables.net/erefom/2/edit

Также см. Этот ответ: Каков наилучший способ анализа времени в объекте Date из пользовательского ввода в Javascript?

0 голосов
/ 03 октября 2014

Вот что у меня сработало

jQuery.extend(jQuery.fn.dataTableExt.oSort, {
    "time-sort-pre": function(a) {
        if (a == '')
            return null;

        var time = a.match(/(\d+)(:(\d\d))?\s*(p?)/i);
        if (time == null)
            return null;

        var hours = parseInt(time[1], 10);
        if (hours == 12 && !time[4]) {
            hours = 0;
        }
        else {
            hours += (hours < 12 && time[4]) ? 12 : 0;
        }

        var d = new Date();
        d.setHours(hours);
        d.setMinutes(parseInt(time[3], 10) || 0);
        d.setSeconds(0, 0);
        return d;
    },
    "time-sort-asc": function(a, b) {
        return ((a < b) ? -1 : ((a > b) ? 1 : 0));
    },
    "time-sort-desc": function(a, b) {
        return ((a < b) ? 1 : ((a > b) ? -1 : 0));
    }
});

с использованием фрагмента кода из этого ответа Каков наилучший способ проанализировать время в объекте Date из пользовательского ввода в Javascript? и протестирован с dataTables 1.9.4, этот код нужно вызывать после dataTables.js в качестве плагина, тогда просто нужно установить de sType для вашего столбца {sType: "time-sort"}. Пример:

$('#datatable-list').dataTable(
    aoColumns: [{sType: "time-sort"}]
);

Предполагая, что ваша таблица имеет только один столбец со значениями времени

0 голосов
/ 27 марта 2013

Разработка из более ранних примеров;следующий фрагмент будет отсортирован, даже если ячейка времени пуста.

function getTimeValue(x) {
  // if the cell is not empty then parse it, otherwise just return 0 as the value; so it will be sorted appropriately.      
  if (x != '') {
    var time = x.match(/(\d+)(?::(\d\d))?\s*(P?)/);  
    var h = parseInt(time[1]) + (time[3] ? 12 : 0);
    if(!time[3] && parseInt(time[1])==12) h = 0;
    if(time[3] && parseInt(time[1])==12) h = 12;

    return h * 60 + ( parseInt(time[2]) || 0 );
  } else {
    return 0;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...