【问题标题】:Date sorting problem with jQuery TablesorterjQuery Tablesorter 的日期排序问题
【发布时间】:2009-11-10 13:07:55
【问题描述】:

我正在尝试对具有2009-12-17 23:59:59.0 之类的列的表进行排序。 我在下面使用来应用排序

$(document).ready(function() { 
    $("#dataTable").tablesorter();  
});

但它不适用于 yyyy-mm-dd 格式的日期。 谁能建议我如何应用这种格式进行排序?

【问题讨论】:

  • 定义“不工作” - 它应该如何工作以及如何不工作?
  • 它适用于 AlphaNumeric 值,但不适用于格式为“yyyy-mm-dd”的日期

标签: jquery tablesorter


【解决方案1】:

正确的做法是为这种自定义格式添加您自己的解析器。

查看此内容以了解其工作原理。

jQuery Tablesorter: Add your own parser

然后查看 tablesorter 源(搜索 uslongdate、shortdate,然后观察日期格式的解析器是如何由 tablesorter 在内部完成的。现在为您的特定日期格式构建一个类似的解析器。

jquery.tablesorter.js

这应该符合你的喜好

ts.addParser({
    id: "customDate",
    is: function(s) {
        //return false;
        //use the above line if you don't want table sorter to auto detected this parser
        //else use the below line.
        //attention: doesn't check for invalid stuff
        //2009-77-77 77:77:77.0 would also be matched
        //if that doesn't suit you alter the regex to be more restrictive
        return /\d{1,4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}\.\d+/.test(s);
    },
    format: function(s) {
        s = s.replace(/\-/g," ");
        s = s.replace(/:/g," ");
        s = s.replace(/\./g," ");
        s = s.split(" ");
        return $.tablesorter.formatFloat(new Date(s[0], s[1]-1, s[2], s[3], s[4], s[5]).getTime()+parseInt(s[6]));
    },
    type: "numeric"
});

现在只需将其应用于您具有此格式的列(例如,假设您的自定义日期所在的列位于第 7 列中。(6 表示第 7 列,因为列的数组是从零开始的)

$(function() {
    $("table").tablesorter({
        headers: {
            6: { sorter:'customDate' }
        }
    });
});

【讨论】:

  • 好吧,如果我动态检索了 Table 并且我不知道哪个 Column 具有 Date 格式,在这种情况下有什么想法吗?
  • 检查修改后的代码。现在你可以放弃较低的代码 sn-p 因为 tablesorter 应该自动为正确的列选择你的排序器
  • @jitter ,很好的答案,谢谢。我试图弄清楚为什么 ts 找不到与这种格式的日期匹配: dd/MM/yyyy 。会欣赏任何建议。谢谢,奥马尔
  • brilliant - 以 MSSql 的默认 datetime2(7) 格式格式化日期。
【解决方案2】:

按英国/欧洲日期格式 dd/mm/yyyy 排序:

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

【讨论】:

【解决方案3】:

使用最新版本 2.18.4,您可以简单地这样做。只需提供默认日期格式,并在特定列中设置列日期格式,这仅适用于“shortDate”排序器。

$('YourTable').tablesorter(
            {
                dateFormat:'mmddYYYY',
                headers: {
                    0: { sorter: false },
                    1: { sorter: true},
                    2: { sorter: true },
                    3: { sorter: true },
                    4: { sorter: "shortDate", dateFormat: "ddmmyyyy" },
                    5: { sorter: true },
                    6: { sorter: false },
                    7: { sorter: false },
                    8: { sorter: false },
                    9: { sorter: false },
                    10: { sorter: false },
                    11: { sorter: false }

                }
            });

【讨论】:

    【解决方案4】:

    如果您使用日期/时间格式,例如 mm/dd/yyyy hh:mm,请在下方使用

    $.tablesorter.addParser({ 
            id: "customDate",
            is: function(s) {
                //return false;
                //use the above line if you don't want table sorter to auto detected this parser                        
                //21/04/2010 03:54 is the used date/time format 
                return /\d{1,2}\/\d{1,2}\/\d{1,4} \d{1,2}:\d{1,2}/.test(s);
            },
            format: function(s) {
                s = s.replace(/\-/g," ");
                s = s.replace(/:/g," ");
                s = s.replace(/\./g," ");
                s = s.replace(/\//g," ");
                s = s.split(" ");                       
                return $.tablesorter.formatFloat(new Date(s[2], s[1]-1, s[0], s[3], s[4]).getTime());                                         
            },
            type: "numeric"} );
    

    【讨论】:

      【解决方案5】:

      无需创建新的解析器只需稍加修改即可使用现有的解析器。

      1.打开Jquery插件js,您将在其中看到下面的脚本。现在只需更改最后一个 else 的日期格式(所需),如果在您的情况下它是“yy-mm-dd”。

          ts.addParser({
          id: "shortDate",
          is: function (s) {
              return /\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s);
          }, format: function (s, table) {
              var c = table.config;
              s = s.replace(/\-/g, "/");
              if (c.dateFormat == "us") {
                  // reformat the string in ISO format
                  s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$1/$2");
              } else if (c.dateFormat == "uk") {
                  // reformat the string in ISO format
                  s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$2/$1");
              } else if (c.dateFormat == "yy-mm-dd" || c.dateFormat == "dd-mm-yy") {
                  s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/, "$1/$2/$3");
              }
              return $.tablesorter.formatFloat(new Date(s).getTime());
          }, type: "numeric"
      });
      



      2. 现在按照 jitter 提到的最后一步进行,但几乎没有修改。

      $(function() {
      $("table").tablesorter({
          headers: {
              6: { sorter:'shortDate' }
          }
      });
      });
      

      【讨论】:

      • “破解核心”很少是个好主意——当您或其他开发人员更新库时,它会被覆盖。
      【解决方案6】:

      dateFormat : "mmddyyyy", // 设置默认日期格式

      example-option-date-format

      【讨论】:

        【解决方案7】:

        只需添加另一个选项即可完美地对日期格式进行排序(dd/MM/yyyy hh:mm:ss)。 通过使用js dataTables 插件。

        将以下代码添加到您的 is 代码中:

        $(document).ready(function () {
        oTable = $('#AjaxGrid').dataTable({
        "aLengthMenu": [[5, 10, 25, 50, 100, 500,1000,-1], [5, 10, 25, 50, 100,500,1000,"All"]],
        iDisplayLength: 1000,
        aaSorting: [[2, 'asc']],
        bSortable: true,
        aoColumnDefs: [
        { "aTargets": [ 1 ], "bSortable": true },
        { "aTargets": [ 2 ], "bSortable": true },
        { "aTargets": [ 3 ], "bSortable": true },
        { "aTargets": [ 4 ], "bSortable": true },
        {"aTargets": [ 5 ], "bSortable": true, "sType": "date-euro"},
        {"aTargets": [ 6 ], "bSortable": true, "sType": "date-euro"},
        { "aTargets": [ 7 ], "bSortable": false }
        ],
        "sDom": '<"H"Cfr>t<"F"ip>',
        "oLanguage": {
        "sZeroRecords": "- No Articles To Display -",
        "sLengthMenu": "Display _MENU_ records per page",
        "sInfo": " ", //"Displaying _START_ to _END_ of _TOTAL_ records",
        "sInfoEmpty": " ", //"Showing 0 to 0 of 0 records",
        "sInfoFiltered": "(filtered from _MAX_ total records)"
        },
        "bJQueryUI": true
        });
        });
        
        
        //New code
        jQuery.extend( jQuery.fn.dataTableExt.oSort, {
        "date-euro-pre": function ( a ) {
        if ($.trim(a) != '') {
        var frDatea = $.trim(a).split(' ');
        var frTimea = frDatea[1].split(':');
        var frDatea2 = frDatea[0].split('/');
        var x = (frDatea2[2] + frDatea2[1] + frDatea2[0] + frTimea[0] + frTimea[1] + frTimea[2]) * 1;
        } else {
        var x = 10000000000000; // = l'an 1000 ...
        }
        
        return x;
        },
        
        "date-euro-asc": function ( a, b ) {
        return a - b;
        },
        
        "date-euro-desc": function ( a, b ) {
        return b - a;
        }
        } );
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多