我正在使用表格排序器插件来对表格进行排序。 我希望能够以格式捕获日期列:
dd / MM / yyyy HH:mm
然后对它们进行正确排序(为此我必须用几年来切换天数)。
这是我到目前为止:
ts.addParser({
id: "hebreLongDate",
is: function (s) {
return /\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4} d{1,2}:d{1,2}/.test(s);
}, format: function (s, table) {
var c = table.config;
s = s.replace(/\-/g, "/");
// reformat the string in ISO format
s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$2/$1");
return $.tablesorter.formatFloat(new Date(s).getTime());
}, type: "numeric"
});
它不起作用。
我会感激任何帮助,特别是如果它附带了正确的正则表达式的含义的解释。
谢谢, 奥马尔
答案 0 :(得分:1)
解析器并未真正验证日期。 is
函数仅检测格式是否与format
函数的模式匹配,这就是为什么更容易使其返回false并使用headers
手动设置列的解析器的原因选项:
headers: {
1: { sorter: "hebreLongDate" }
},
上面的is
函数在模式中需要HH:mm
,因此如果列中的第一个表格单元格不匹配,它将忽略该解析器。因此,无论哪种方式,最好手动设置解析器。
无论如何,这就是我要编写你所描述的解析器的方式(demo):
$.tablesorter.addParser({
id: "hebreLongDate",
is: function(s) {
return false;
},
format: function(s, table, cell, cellIndex) {
s = s
// replace separators
.replace(/\s+/g," ").replace(/[\-.,]/g, "/")
// reformat dd/mm/yyyy to yyyy/mm/dd
.replace(/(\d{1,2})[\/\s](\d{1,2})[\/\s](\d{4})/, "$3/$2/$1");
return s ? $.tablesorter.formatFloat( (new Date(s).getTime() || ''), table) : s;
},
type: "numeric"
});
至于解释正则表达式,上面的代码与你在问题中的内容之间没有太大区别。最大的区别是上面的代码确保日期和时间之间只存在一个空格,并且日期可以用斜杠,短划线,句点,逗号或空格分隔(即1-1-2000
,1 1 2000
等)。
更新:如果您想要自动检测此解析器,请使用以下is
正则表达式(updated demo)。但重要的是要注意,这个正则表达式无法区分mmddyyyy和ddmmyyyy,所以它总能检测到ddmmyyyy。要覆盖它,请将标题分类器选项设置为“shortDate”:
is: function(s) {
// testing for ##-##-####, so it's not perfect; time is optional
return (/(^\d{1,2}[\/\s]\d{1,2}[\/\s]\d{4})/).test((s || '').replace(/\s+/g," ").replace(/[\-.,]/g, "/"));
},