如何解决DataTables按日期列排序仅按首数字排序的问题
解决DataTables日期列按字符串排序的问题
你这个情况我太熟了!问题出在DataTables默认把日期列当成普通字符串来排序,所以只会按字符的先后顺序(也就是你看到的只认第一个数字),完全不考虑日期的逻辑顺序。下面给你几个实用的解决方案,按需选就行:
方案1:直接指定列的日期类型(适用于标准日期格式,如YYYY-MM-DD)
如果你的数据库返回的date字段是标准ISO格式(比如2024-05-20),可以在DataTables配置里明确标记第三列是日期类型,这样就能触发正确的日期排序逻辑。修改你的脚本部分:
$('table').DataTable( { dom: 'Bfrtip', "order": [[ 2, "desc" ]], // 新增列配置:指定第三列(索引从0开始)为日期类型 "columnDefs": [ { "type": "date", "targets": 2 } ], buttons: [ 'copy', { extend: 'csv', text: 'CSV', extension: '.csv', exportOptions: { modifier: { page: 'current' } }, title: 'table' }, 'pdf', 'print' ] } );
方案2:使用日期排序插件(适用于非标准日期格式)
如果你的日期格式是其他形式(比如MM/DD/YYYY或者DD-MM-YYYY),直接指定类型可能不生效,这时候需要借助moment.js库和DataTables官方的datetime-moment排序插件:
- 先在页面中引入
moment.js以及datetime-moment插件脚本(可以从官方渠道下载后本地引入); - 在DataTables初始化前,注册你实际使用的日期格式:
// 替换成你表格里的日期格式,比如'DD/MM/YYYY'或者'MM-DD-YYYY' $.fn.dataTable.moment('DD-MM-YYYY'); $('table').DataTable( { dom: 'Bfrtip', "order": [[ 2, "desc" ]], buttons: [ 'copy', { extend: 'csv', text: 'CSV', extension: '.csv', exportOptions: { modifier: { page: 'current' } }, title: 'table' }, 'pdf', 'print' ] } );
方案3:隐藏排序用的真实日期值(备选方案)
如果上面两种方法都不方便,你可以在表格的日期列里添加一个隐藏的data-order属性,用标准格式的日期(比如时间戳或YYYY-MM-DD)作为排序依据,页面依然显示原日期样式:
修改你的PHP输出代码:
// 假设$row['date']是标准可排序格式,若不是可以用PHP转成时间戳 echo "<td data-order='" . $row['date'] . "'>" . $row['date'] . "</td>";
示例:如果原日期是
05-20-2024,可以转成时间戳再赋值给data-order:$timestamp = strtotime($row['date']); echo "<td data-order='" . $timestamp . "'>" . $row['date'] . "</td>";
这样DataTables会读取data-order的值进行排序,页面展示不受影响。
内容的提问来源于stack exchange,提问作者Avalon Parkes-barton
相关产品推荐
相关产品推荐

