2012-01-06 2 views
1

У меня есть DataTable, я использую, который имеет 5 колонок (http://datatables.net/)Как отсортировать по времени (формат: 5:40 PM) в javascript для использования с DataTables?

Столбцы

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

Я хочу, чтобы сортировать по дате FIRST (последнее), тогда я хочу сортировать по времени (последние сверху).

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

На сегодняшний день это уже отлично работает. В datatable есть только 2 дня данных max, поэтому даже когда он перевернется до 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 ??? 
}; 
+0

Так «28 фев» выше «1 марта», но «31 марта» ниже «1 апреля» (то есть календарный порядок наоборот)? – RobG

+0

Theres всего 2 дня максимум данных, но он должен отображать самые последние до самых старых. поэтому 1 апреля наверху, затем 31 марта, 1 марта, 28 февраля (если это показало, что много данных, то есть) – Tallboy

+0

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

ответ

3

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

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

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

Также см. Этот ответ: What is the best way to parse a time into a Date object from user input in Javascript?

+0

интересно, я взгляну на это. Спасибо! – Tallboy

+0

Он по-прежнему не работает: я добавил несколько более сложных слов: http://live.datatables.net/erefom/4/edit#preview – Tallboy

+0

Я также удалил многоколоночную сортировку ради этого примера, чтобы мы могли исключить эту переменную полностью и сосредоточиться только на том, чтобы получить время на работу, а не по отношению к другому столбцу, который сортируется первым. – Tallboy

0

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

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; 
    } 
} 
0

Это то, что работает для меня

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)); 
    } 
}); 

используя кусок кода из этого ответа What is the best way to parse a time into a Date object from user input in Javascript? и протестированы с DataTables 1.9.4, этот код должен быть вызван после dataTables.js в качестве плагин, то просто нужно установить sType в колонку {sType: "time-sort"}.Пример:

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^