0

我正在使用表格排序器插件对表格进行排序。我希望能够以以下格式捕获日期列:

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"
    });

这没用。

我将不胜感激任何帮助,特别是如果它附带对正确正则表达式含义的解释。

谢谢, 奥马尔

4

1 回答 1

1

解析器并没有真正验证日期。该is函数仅检测格式是否与format函数的模式匹配,这就是为什么让它返回 false 并使用headers选项手动设置列的解析器更容易:

headers: {
    1: { sorter: "hebreLongDate" }
},

上面的is函数需要HH:mm模式内的 a,因此如果列中的第一个表格单元格不匹配,它将忽略该解析器。因此,无论哪种方式,最好手动设置解析器。

无论如何,这就是我将如何编写您所描述的解析器(演示):

$.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-20001 1 2000等)分隔。


更新:如果您想自动检测此解析器,请使用以下is正则表达式(更新的演示)。但需要注意的是,此正则表达式无法区分 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, "/"));
},
于 2013-07-17T12:58:38.273 回答