DataTables momentjs排序插件无法正确排序AM/PM格式时间求助
解决DataTables + Moment.js日期排序忽略AM/PM的问题
看起来你遇到的是DataTables列类型配置和Moment插件冲突的问题,不是插件本身的bug,调整一下代码配置就能解决。
问题原因分析
你已经正确注册了带AM/PM的日期格式MM/DD/YYYY hh:mm:ss A,但在columnDefs里手动给日期列设置了"type": "date"——这会覆盖Moment插件的自动处理逻辑,让DataTables使用原生的日期排序规则。而原生规则无法识别AM/PM标识,会把时间当成24小时制解析,所以才会出现7:00 AM排在6:30 PM之后的错误(原生解析会把7当成7点,6当成6点,7比6大,自然排后面)。
解决方案
- 移除
columnDefs中的"type": "date"配置,让Moment插件自动接管该列的排序逻辑 - 确保日期列的文本格式和你注册的
MM/DD/YYYY hh:mm:ss A完全匹配(比如AM/PM是大写,没有多余空格) - 确认
hfDateColumnNum的值是正确的列索引(DataTables列索引从0开始)
修正后的代码示例
$(document).ready(function () { // 注册可排序的日期格式 $.fn.dataTable.moment('MM/DD/YYYY hh:mm:ss A'); $('#<%=gvNotes.ClientID%>').dataTable({ "order": [[1, 'desc']], "columnDefs": [ { "orderable": false, "targets": 0 }, // 禁用“编辑”列的排序 // 移除type: "date"配置,让Moment插件自动处理日期列排序 { "targets": $('#<%=hfDateColumnNum.ClientID%>').val() } ] }); });
补充说明
当你调用$.fn.dataTable.moment()注册日期格式后,DataTables会自动检测所有列中符合该格式的单元格,将它们的排序类型设置为对应的moment格式,这样排序时就会正确识别AM/PM,按照实际时间顺序排列。
内容的提问来源于stack exchange,提问作者TheIronCheek
相关产品推荐
相关产品推荐

