在jquery中验证和排序日期

时间:2013-07-17 09:44:06

标签: javascript jquery regex tablesorter

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

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

它不起作用。

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

谢谢, 奥马尔

1 个答案:

答案 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-20001 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, "/"));
},