jQuery插件Tablesorter错误地对日期进行排序

Posted

技术标签:

【中文标题】jQuery插件Tablesorter错误地对日期进行排序【英文标题】:jQuery plugin Tablesorter sorts dates incorrectly 【发布时间】:2013-03-04 06:38:03 【问题描述】:

我正在尝试使用 jQuery 插件 Tablesorter 对日期字段进行排序。现在奇怪的是排序似乎部分起作用了,它确实重新排列了结果显示的顺序,这表明至少脚本已初始化。

现在我不明白为什么会这样,我的 html 看起来像这样:

<link href="/themes/blue/Style.css" rel="stylesheet" type="text/css" />
<script src="/Scripts/jquery-ui-1.8.20.js" type="text/javascript"></script>
<script src="/Scripts/jquery.tablesorter.js" type="text/javascript"></script>
<script>
$(document).ready(function ()
 
    $("#repairtable").tablesorter(
 
    sortList: [[1, 0]], 
    dateFormat : "ddmmyyyy",
    headers:  1: sorter: "shortDate", dateFormat: "ddmmyyyy" 
);
 
);
</script>
<table id="repairtable" class="tablesorter">
<thead>
<tr>
<th>ID</th>
    <th>Date In</th>
    <th>Customer</th>
</tr>
</thead>
<tbody>
<tr>
   <td>48</td>
   <td>11/03/2013</td>
   <td>Rainhem Launderette</td>
</tr>
<tr>
   <td>13</td>
   <td>10/01/2013</td>
   <td>IESA (Gunstones)</td>
</tr>
<tr>
   <td>14</td>
   <td>10/01/2013</td>
   <td>GVF</td>
</tr>
<tr>
   <td>41</td>
   <td>08/03/2013</td>
   <td>Triumph</td>
</tr>
<tr>
   <td>42</td>
   <td>08/03/2013</td>
   <td>Triumph</td>
</tr>
<tr>
   <td>43</td>
   <td>08/03/2013</td>
   <td>Triumph</td>
</tr>   
<tr>
   <td>40</td>
   <td>07/03/2013</td>
   <td>RAG Collections Ltd</td>
</tr>
<tr>
   <td>38</td>
   <td>06/03/2013</td>
   <td>WM Sinclair</td>
</tr>
<tr>
   <td>39</td>
   <td>06/03/2013</td>
   <td>WM Sinclair</td>
</tr>
<tr>
   <td>22</td>
   <td>05/03/2013</td>
   <td>IESA Weetabix B'Lat</td>
</tr>
</tbody>
</table>

单击相应的列标题确实会对存储在单元格中的数据进行排序,但会错误地对日期进行排序。我试图按天/月/年订购它们,但似乎没有这样做。实际上,表格中的数据比我在这里显示的要多,一个日期字段是 25/02/2013,它应该高于 10/01/2013,这是我提供的屏幕截图中的第二行。

我对 Web 开发比较陌生,任何指点都将不胜感激。

【问题讨论】:

实际上,至少在最新版本的脚本 (v2.7.12) 中,您的代码确实对列进行了正确排序 (demo)。 嗯,我看到它的行为很奇怪。 Ckersch 的建议确实可以正确地按日-月-年格式化它(dateFormat="uk")。我想它适用于最新版本,因为我编写的代码是基于我在编写它时正在阅读的更高版本文档。事实证明,出于某种莫名其妙的愚蠢原因,我使用了旧版本!无论如何,很高兴知道它在我正在阅读文档的版本上按照我最初的预期工作。 【参考方案1】:

美国有一个奇数日期约定,其中日期往往写成月/日/年,所以它是这样排序的。

编辑:tablesorter 中已经存在该功能。使用:

$("#tableName").tablesorter(dateFormat: "uk");

来自this other question about tablesorter.

【讨论】:

感谢您的回复,tablesort 库自 2010 年(发布该问题时)以来发生了变化,增加了一些额外的功能。它应该有一个内置的解析器,只需在 dateFormat 中指定格式即可解析 dd/mm/yyyy 格式。我怀疑我很愚蠢并且错误地使用它,但我不知道如何。 你是绝对正确的,虽然根据我阅读的文档, dateFormat: "uk" 应该已被弃用。假设 2.0.23 以后使用“ddmmyyyy”格式,下面的任何内容都使用不同的参数,例如你提到的“uk”。无论如何,你是对的,它工作顺利。我很困惑,认为 2.0.5 比 2.0.23 更高版本,因为我是个白痴。无论如何,非常感谢! 以上的cmets为我节省了很多时间。当我需要新格式时,我一直在摸不着头脑,为什么“uk”不起作用:$("#tableName").tablesorter(dateFormat: "ddmmyyyy");【参考方案2】:

我所做的是:在插件的第 970 行附近,在 ts.addParser 函数中,我将以下代码更改为 else if 日期格式:

        if (c.dateFormat == "us") 
            // reformat the string in ISO format
            s = s.replace(/(\d1,2)[\/\-](\d1,2)[\/\-](\d4)/, "$3/$1/$2");
         else if (c.dateFormat == "uk") 
            // reformat the string in ISO format
            s = s.replace(/(\d1,2)[\/\-](\d1,2)[\/\-](\d4)/, "$3/$2/$1");
         else if (c.dateFormat == "dd/mm/yy" || c.dateFormat == "dd-mm-yy") 
            s = s.replace(/(\d1,2)[\/\-](\d1,2)[\/\-](\d2)/, "$1/$2/$3");
            // I added the lines below for the format with full year format,
            // Note that I inverted the day and month in the final format so
            // when the string is converted to date, it converts it right
         else if (c.dateFormat == "dd/mm/yyyy" || c.dateFormat == "dd-mm-yyyy")
            s = s.replace(/(\d1,2)[\/\-](\d1,2)[\/\-](\d4)/, "$2/$1/$3");
        

【讨论】:

以上是关于jQuery插件Tablesorter错误地对日期进行排序的主要内容,如果未能解决你的问题,请参考以下文章

jQuery插件 tablesorter 表格排序 使用说明

jQuery插件 tablesorter 表格排序 使用说明

在生产服务器上使用 jQuery tablesorter 插件对日期列进行排序不起作用

Jquery排序分页插件tablesorter简介

jQuery tablesorter 页面插件不起作用

问题:使用 jquery 插件 tablesorter 进行表格排序和分页