如何在jsGrid中正确排序带AM/PM的12小时制时间列?
jsGrid带AM/PM的12小时制时间列排序错误的问题分析与修复
核心问题分析
你的jsGrid时间列排序失效,本质是排序逻辑没有正确解析带AM/PM的12小时制时间字符串,具体配置问题如下:
- sorttype配置未适配AM/PM格式:你设置了
sorttype: "date",但jsGrid默认的date类型排序仅能识别标准日期格式(如YYYY-MM-DD或HH:mm:ss),无法自动解析带AM/PM的12小时制时间字符串。此时排序会退化为字符串字典序比较,比如"10:00 AM"会因为字符串开头的"10"比"02:00 PM"的"02"大,被排在前面,这就是截图里的错误排序结果。 - 缺失日期格式解析配置:你注释掉了
datefmt: "m/d/Y h:i A",这个配置是告诉jsGrid如何解析字段的时间字符串格式。没有它,jsGrid无法将"hh:mm AM/PM"格式的字符串转换为可用于排序的日期对象。 - 自定义字段
customTime的排序逻辑未适配:如果customTime是你自定义的字段类型,默认的sorttype: "date"可能不会生效,因为自定义字段需要明确实现排序比较逻辑,否则会使用默认的字符串排序。
修复方案
针对上述问题,给出两种可行的修复方式:
方式一:利用jsGrid内置date字段的解析能力
恢复并配置正确的datefmt,让jsGrid自动解析AM/PM时间:
{ name: "TimeStart", title: "Start", type: "customTime", width: "100px", validate: "required", sorttype: "date", datefmt: "h:i A", // 关键:指定12小时制带AM/PM的格式 formatter : { date : { AmPm : ["am","pm","AM","PM"], } }, // 其他配置保留... }
注意:如果你的customTime字段继承自jsGrid的date字段,这个配置才能生效;如果是完全自定义的字段,需要确保它能读取datefmt并正确解析时间。
方式二:自定义排序比较函数(更可靠)
直接通过sorttype定义自定义函数,将时间字符串转换为时间戳进行比较,彻底避免格式解析问题:
{ name: "TimeStart", title: "Start", type: "customTime", width: "100px", validate: "required", // 替换sorttype为自定义函数 sorttype: function(item) { // 拼接固定日期,确保仅比较时间部分(如果你的数据包含日期,直接用item.StartDate拼接) const fullTimeStr = `2000-01-01 ${item.TimeStart}`; // 解析为Date对象并返回时间戳,用于排序比较 return new Date(fullTimeStr).getTime(); }, formatter : { date : { AmPm : ["am","pm","AM","PM"], } }, // 其他配置保留... }
这种方式不依赖自定义字段的继承逻辑,直接基于时间戳排序,结果绝对准确。
额外注意
你在itemTemplate里添加了隐藏的Date.parse(item.StartDate),但jsGrid的排序是基于原始数据的字段值(即item.TimeStart),不是模板渲染后的DOM内容,所以这个隐藏值对排序没有帮助,可以去掉。
内容的提问来源于stack exchange,提问作者love thakker
相关产品推荐
相关产品推荐

