jQuery Datatables Ultimate 日期/时间排序插件

Posted

技术标签:

【中文标题】jQuery Datatables Ultimate 日期/时间排序插件【英文标题】:jQuery Datatables Ultimate Date/Time Sorting Plugin 【发布时间】:2016-09-10 02:25:26 【问题描述】:

我们正在使用 Datatables 终极日期/时间排序插件 (https://datatables.net/blog/2014-12-18) 来尝试对日期列进行排序,但无法让它以正确的格式正确排序日期。页面加载时,会运行以下脚本:

//sets the date format for datatables for sorting purposes
//reference: https://datatables.net/blog/2014-12-18
$.fn.dataTable.moment( 'M/D/YYYY' );

/* Datatables */
$('.datatable').DataTable(
    language : 
        search : "_INPUT_",
        searchPlaceholder : "Search...",
        paginate : 
            "next" : '<i class="fa fa-chevron-right"></i>',
            "previous" : '<i class="fa fa-chevron-left"></i>'
        
    ,
    responsive : 
        details : 
            display : $.fn.dataTable.Responsive.display.childRowImmediate,
            type : 'column'
        
    ,
    order : [0, 'desc'],

  //date sorting
  columnDefs:
  
    targets: 'date_sortable',
    render: function ( data, type, full, meta ) 
      if(type === 'display')
         if(data)
            var mDate = moment(data);
            data = (mDate && mDate.isValid()) ? mDate.format("M/D/YYYY") : "";
            console.log('rewrote data to ' + data);
         
     
      console.log('date_sortable rendered');
     return data;
   
  
);

根据 Datatables 文档和我在此 SO 帖子 (DataTables Ultimate date / time sorting plug-in not working with Intl formats) 上找到的详细信息,我在我的 html 中的 &lt;th /&gt; 元素上添加了 date_sortable 作为类名,但它看起来像 @987654328 @ 函数没有被调用,因为我的 console.log[...] 条目从未运行。我可以在生成的 HTML 中看到该类位于我的 &lt;th /&gt; 元素上,并且显示的日期格式正确('n/j/Y',在 php 中),所以我完全不知所措。

一切看起来都设置正确,所以这里有什么提示/指针吗?日期排序在本质上似乎是相当随机的,具有日期的条目(例如 2016 年 1 月 6 日)显示在中间(见截图),这根本没有意义。

我会说这张表显示了约 2,055 条记录,这可能是性能问题吗?这目前没有通过 API 调用加载,因此所有记录都在生成的 HTML 中作为单个文件。

【问题讨论】:

它不是随机的,它是字符串排序而不是数字。在此示例中,它按 2、2、2、6、7 的顺序排序 【参考方案1】:

你能看看 Datatables 中的 unshifted Function 吗?

// Add type detection
types.detect.unshift( function ( d ) 
return moment( d, format, locale, true ).isValid() ?
    'moment-'+format :
    null;
 );

如果是这样,你应该使用这个:

$.fn.dataTable.moment('YYYY-M-D');

【讨论】:

我们使用它来显示数据:&lt;?php echo date('n/j/Y', strtotime($order-&gt;OrderDate)); ?&gt;。你能通过转换为时间戳然后排序来澄清你的意思吗?您是说在 PHP 的某个地方或其他地方执行此操作吗? 我删除了带有时间戳的解决方案,因为它是一个肮脏的解决方案!所以我不会将它用于生产代码! 我认为从 unshift 函数返回的时刻是使用本地日期格式 - 所以是您系统的格式。这肯定与 n/j/Y 不同。 我首先尝试了这种格式,但由于某种原因它仍然无法正常工作。我查找了 unshift 函数的 API 文档,但老实说,我并没有遵循它的意图。你能为我澄清一下吗?谢谢! 好的,您可以在 Datatables 代码中的“types.order[ 'moment-'+format+'-pre' ] = function (d) ” 下写下您的内容吗? - 或者把你的代码放到 jsfiddle【参考方案2】:

请试试这个小提琴(这适用于您的日期格式):

`http://jsfiddle.net/Marouen/9qdj53am`

希望这会有所帮助。

【讨论】:

以上是关于jQuery Datatables Ultimate 日期/时间排序插件的主要内容,如果未能解决你的问题,请参考以下文章

jquery.dataTables--插件使用方法

jQuery DataTables 仅过滤特定列

JQuery插件之Jquery.datatables.js用法及api

jquery之DataTables的使用

jquery-datatables-rails。响应式扩展和移动视图

JQuery插件datatables相关api