You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DataTable按dd/MM/yyyy格式排序异常求助

问题解决:DataTables日期列按字符串排序而非日期排序

问题根源

页面渲染的是dd/MM/yyyy格式的日期字符串,DataTables默认按字符串字典序排序,而非实际日期逻辑。虽然指定了datetime-moment类型,但未正确配置解析规则,导致插件无法识别显示的日期格式。

解决方案1:配置Moment.js解析规则

确保已引入moment.js和DataTables的dataTables.moment.js插件,在DataTables初始化前注册对应的日期解析格式:

// 注册DD/MM/YYYY格式的日期解析规则
$.fn.dataTable.moment('DD/MM/YYYY');

$(function () {
        $('.tum-cihaz-listesi').DataTable({
            initComplete: function () {
                var api = this.api();
                var footers = $('tfoot th');
                for (i = 0; i < footers.length; i++) {
                    api.order.listener(footers[i], i);
                }
            },
            responsive: true,
            pageLength: 50,
            paging: true,
            ordering: true,
            info: true,
            dom: '<"top"lfB>rt<"bottom"ip>',
            buttons: [
                'copy', 'csv', 'excel', 'print',
                {
                    extend: 'pdfHtml5',
                    text: 'Portrait PDF',
                    exportOptions: {
                        columns: ':visible', orthogonal: 'print'
                    }
                },
                {
                    extend: 'pdfHtml5',
                    text: 'Landscape PDF',
                    orientation: 'landscape',
                    exportOptions: {
                        columns: ':visible', orthogonal: 'print'
                    }
                }
            ],
            columnDefs: [
                { type: 'datetime-moment', targets: [6, 7, 8] }
            ]
        });
});

解决方案2:使用data-order属性指定排序用原始日期

修改MVC视图代码,给每个日期列的<td>添加data-order属性,传入数据库原始的yyyy-MM-dd格式日期作为排序依据,页面仍显示dd/MM/yyyy格式:

<td data-order="@(item.INVENTORY_DETAILs.InstallDate.HasValue ? item.INVENTORY_DETAILs.InstallDate.Value.ToString("yyyy-MM-dd") : "")">
    @if (item.INVENTORY_DETAILs.InstallDate.HasValue)
        {@item.INVENTORY_DETAILs.InstallDate.Value.ToString("dd/MM/yyyy")}
</td>
<td data-order="@(item.INVENTORY_DETAILs.CalibrationCareDate.HasValue ? item.INVENTORY_DETAILs.CalibrationCareDate.Value.ToString("yyyy-MM-dd") : "")">
    @if (item.INVENTORY_DETAILs.CalibrationCareDate.HasValue)
        {@item.INVENTORY_DETAILs.CalibrationCareDate.Value.ToString("dd/MM/yyyy")}
</td>
<td data-order="@(item.INVENTORY_DETAILs.CalibrationValidateDate.HasValue ? item.INVENTORY_DETAILs.CalibrationValidateDate.Value.ToString("yyyy-MM-dd") : "")">
    @if (item.INVENTORY_DETAILs.CalibrationValidateDate.HasValue)
        {@item.INVENTORY_DETAILs.CalibrationValidateDate.Value.ToString("dd/MM/yyyy")}
</td>

此时可移除DataTables配置中columnDefs里的datetime-moment设置,DataTables会自动使用data-order的值进行正确排序。

注意事项

  • 方案1依赖Moment.js及对应DataTables插件,需确保资源引入正确;
  • 方案2无需额外依赖,直接通过HTML属性传递排序值,兼容性更稳定。

内容的提问来源于stack exchange,提问作者zaferbayar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 04:37:06