2016-10-30 3 views
0

У меня была проблема с сортировкой даты, она не включала месяц при сортировке и сортировалась только по дню. Я решил, добавив следующий код:сортировка даты не работает в datatable

jQuery.extend(jQuery.fn.dataTableExt.oSort, { 
    "datetime-pre": function (a) { 
     var ukDatea = a.split('/'); 
     return (ukDatea[2] + ukDatea[1] + ukDatea[0]) * 1; 
    }, 

    "datetime-asc": function (a, b) { 
     return ((a < b) ? -1 : ((a > b) ? 1 : 0)); 
    }, 

    "datetime-desc": function (a, b) { 
     return ((a < b) ? 1 : ((a > b) ? -1 : 0)); 
    } 
    }); 
    var dt = $('#wires').DataTable({ 
     "aoColumns": [ 
      null, 
      null, 
      { "sType": "datetime" }, 
      { "sType": "datetime" }, 
      null,null,null,null,null,null,null,null,null,null,null,null,null,null 
     ], 

Но теперь сортировки столбца (часть DataTable заголовка) не работает только одной из колонн, которые включают в себя дату. Любые советы/решения?

+0

Можете ли вы предоставить нам полный фрагмент с также ваш HTML? – Bellu

ответ

0

Каков формат даты, который вы пытаетесь отсортировать?

Я сделал функции для сортировки даты pt-BR (dd/MM/yyyy) и даты и времени (dd/MM/yyyy HH: mm: ss). Мне нужно было преобразовать даты в целые числа, чтобы правильно сравнивать их. Например: дата "25/03/2016" становятся целое число 20160325.

Посмотрите:

jQuery.extend(jQuery.fn.dataTableExt.oSort, { 
    "br_datetime-asc": function (a, b) { 
     var x, y; 
     if (jQuery.trim(a) !== '') { 
      var deDatea = jQuery.trim(a).split(' '); 
      var deTimea = deDatea[1].split(':'); 
      var deDatea2 = deDatea[0].split('/'); 
      if (typeof deTimea[2] !== 'undefined') { 
       x = (deDatea2[2] + deDatea2[1] + deDatea2[0] + deTimea[0] + deTimea[1] + deTimea[2]) * 1; 
      } else { 
       x = (deDatea2[2] + deDatea2[1] + deDatea2[0] + deTimea[0] + deTimea[1]) * 1; 
      } 
     } else { 
      x = Infinity; // = l'an 1000 ... 
     } 

     if (jQuery.trim(b) !== '') { 
      var deDateb = jQuery.trim(b).split(' '); 
      var deTimeb = deDateb[1].split(':'); 
      deDateb = deDateb[0].split('/'); 
      if (typeof deTimeb[2] !== 'undefined') { 
       y = (deDateb[2] + deDateb[1] + deDateb[0] + deTimeb[0] + deTimeb[1] + deTimeb[2]) * 1; 
      } else { 
       y = (deDateb[2] + deDateb[1] + deDateb[0] + deTimeb[0] + deTimeb[1]) * 1; 
      } 
     } else { 
      y = Infinity; 
     } 
     var z = ((x < y) ? -1 : ((x > y) ? 1 : 0)); 
     return z; 
    }, 

    "br_datetime-desc": function (a, b) { 
     var x, y; 
     if (jQuery.trim(a) !== '') { 
      var deDatea = jQuery.trim(a).split(' '); 
      var deTimea = deDatea[1].split(':'); 
      var deDatea2 = deDatea[0].split('/'); 
      if (typeof deTimea[2] !== 'undefined') { 
       x = (deDatea2[2] + deDatea2[1] + deDatea2[0] + deTimea[0] + deTimea[1] + deTimea[2]) * 1; 
      } else { 
       x = (deDatea2[2] + deDatea2[1] + deDatea2[0] + deTimea[0] + deTimea[1]) * 1; 
      } 
     } else { 
      x = Infinity; 
     } 

     if (jQuery.trim(b) !== '') { 
      var deDateb = jQuery.trim(b).split(' '); 
      var deTimeb = deDateb[1].split(':'); 
      deDateb = deDateb[0].split('/'); 
      if (typeof deTimeb[2] !== 'undefined') { 
       y = (deDateb[2] + deDateb[1] + deDateb[0] + deTimeb[0] + deTimeb[1] + deTimeb[2]) * 1; 
      } else { 
       y = (deDateb[2] + deDateb[1] + deDateb[0] + deTimeb[0] + deTimeb[1]) * 1; 
      } 
     } else { 
      y = Infinity; 
     } 
     var z = ((x < y) ? 1 : ((x > y) ? -1 : 0)); 
     return z; 
    }, 

    "br_date-asc": function (a, b) { 
     var x, y; 
     if (jQuery.trim(a) !== '') { 
      var deDatea = jQuery.trim(a).split('/'); 
      x = (deDatea[2] + deDatea[1] + deDatea[0]) * 1; 
     } else { 
      x = Infinity; // = l'an 1000 ... 
     } 

     if (jQuery.trim(b) !== '') { 
      var deDateb = jQuery.trim(b).split('/'); 
      y = (deDateb[2] + deDateb[1] + deDateb[0]) * 1; 
     } else { 
      y = Infinity; 
     } 
     var z = ((x < y) ? -1 : ((x > y) ? 1 : 0)); 
     return z; 
    }, 

    "br_date-desc": function (a, b) { 
     var x, y; 
     if (jQuery.trim(a) !== '') { 
      var deDatea = jQuery.trim(a).split('/'); 
      x = (deDatea[2] + deDatea[1] + deDatea[0]) * 1; 
     } else { 
      x = Infinity; 
     } 

     if (jQuery.trim(b) !== '') { 
      var deDateb = jQuery.trim(b).split('/'); 
      y = (deDateb[2] + deDateb[1] + deDateb[0]) * 1; 
     } else { 
      y = Infinity; 
     } 
     var z = ((x < y) ? 1 : ((x > y) ? -1 : 0)); 
     return z; 
    } 
}); 

Edit: А в columnDefs вы должны установить br_datetime или br_date. Или, возможно, использовать плагин (https://datatables.net/plug-ins/type-detection/) обнаружения типа с пользовательскими функциями:

jQuery.fn.dataTableExt.aTypes.unshift(
    function (sData) { 
     if (sData !== null && typeof sData !== 'string') { 
      sData = sData.toString(); 
     } 
     if (sData !== null && sData.match(/^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])\/(19|20|21)\d\d$/)) { 
      return 'br_date'; 
     } 
     else if (sData !== null && sData.match(/^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])\/(19|20|21)\d\d [0-9]{2}:[0-9]{2}(:[0-9]{2})?$/)) { 
      return 'br_datetime'; 
     } 
     return null; 
    } 
); 
Смежные вопросы