适用于自定义日期格式的Tablesorter插件的自定义分析器

时间:2012-05-05 18:59:53

标签: jquery parsing tablesorter date-format

我需要调整jQuery Tablesorter插件,以非常简单的格式对日期进行排序,该格式包括三个字母的月份和4位数的日期(例如2010年5月,2011年1月,2012年3月等)。

我无法绕过如何做到这一点。我尝试调整此处的解析器:http://beausmith.com/blog/custom-date-sorting-for-jquery-tablesorter-plugin/。但是我很失望。为了方便帮助,我将在下面发布他的代码。

// TableSort parser for date format: Jan 6, 1978
$.tablesorter.addParser({
id: 'monthDayYear',
is: function(s) {
  return false;
},
format: function(s) {
  var date = s.match(/^(\w{3})[ ](\d{1,2}),[ ](\d{4})$/);
  var m = monthNames[date[1]];
  var d = String(date[2]);
  if (d.length == 1) {d = "0" + d;}
  var y = date[3];
  return '' + y + m + d;
 },
type: 'numeric'
});
var monthNames = {};
monthNames["Jan"] = "01";
monthNames["Feb"] = "02";
monthNames["Mar"] = "03";
monthNames["Apr"] = "04";
monthNames["May"] = "05";
monthNames["Jun"] = "06";
monthNames["Jul"] = "07";
monthNames["Aug"] = "08";
monthNames["Sep"] = "09";
monthNames["Oct"] = "10";
monthNames["Nov"] = "11";
monthNames["Dec"] = "12";

有关如何为月份名称和年份格式化的任何想法?谢谢!

更新: 我试过在下面的Sam和Fudgey中实现一些代码(感谢你们迄今为止的帮助!)。我无法让它发挥作用。我尝试使用fugey的代码示例,因为我看到它在小提琴演示中完全按照需要工作。下面是我的HTML标记:

<table id="myTable" class="stripeMe sample" width="100%" cellpadding="0"    cellspacing="0">
<thead>
<th width="30%" align="left">COMPANY</th><th width="35%">DESCRIPTION</th><th width="17%"   align="left">INDUSTRY</th><th width="18%" align="left">EXIT DATE</th></tr></thead>
<tbody>
<tr><td width="30%">   <a href="http://www.cartera.com/vesdia.html "> Cartera Commerce,  Inc.</a>  </td>
<td width="35%">Provides technology-enabled marketing and loyalty solutions 
</td><td width="17%">   Financials  </td><td width="18%">Feb 2010</td></tr><tr><td  width="30%">   <a href="http://www.criticalinfonet.com/ "> Critical Information Network,   LLC</a>  </td>
<td width="35%">Operates library of industrial professional training and certification   materials 
</td><td width="17%">   Education  </td><td width="18%">Apr 2011</td></tr><tr><td     width="30%">   <a href="http://www.cynergydata.com/ "> Cynergydata</a>  </td>
<td width="35%">Provides merchant payment processing services and related software products 
</td><td width="17%">   Merchant Processing  </td><td width="18%">May 2011</td></tr><tr>  <td width="30%">   <a href=" "> EVCI Career Colleges Holding Corp</a>  </td>
<td width="35%">Operates post-secondary schools  
</td><td width="17%">   Education  </td><td width="18%">Jul 2012</td></tr><tr><td  width="30%">   <a href="http://www.groundlink.com/ "> Groundlink, Inc.</a>  </td>
<td width="35%">Provides ground transportation services domestically and internationally 
</td><td width="17%">   Transportation  </td><td width="18%">Feb 2012</td></tr><tr><td  width="30%">   <a href="http://www.haggen.com/ "> Haggen, Inc.</a>  </td>
<td width="35%">Operates chain of high-end grocery stores in the Pacific Northwest 
</td><td width="17%">   Grocery  </td><td width="18%">Aug 2011 </td></tr>

</tbody>
</table>

然后我使用的脚本,这是fudgey的但是我将列标题号更改为3(它是我表中的第4列)并且我将调用更改为tablesorter以使用表的id,其中这种情况是原始的#myTable。我还把它包装在jQuery的$(document).ready:

$(document).ready(function() { 
$.tablesorter.addParser({
id: 'monthYear',
is: function(s) {
return false;
},
format: function(s) {
var date = s.match(/^(\w{3})[ ](\d{4})$/);
var m = date ? date[1] + ' 1 ' || '' : '';
var y = date && date[2] ? date[2] || '' : '';
return new Date(m + y).getTime() || '';
},
type: 'Numeric'
});

$('#myTable').tablesorter({
headers: {
    3: {
        sorter: 'monthYear'
    }
}
});
});

它仍然没有按日期对该列进行排序,我不确定它是如何排序的 - 我按此顺序排序,这几乎看起来正确但是看看2010年2月的位置,正好在中间2011年的日期 - 很奇怪: 2011年8月 2010年2月 2011年4月 2011年5月 2012年2月 2012年7月

2 个答案:

答案 0 :(得分:1)

有了良好的约会,这应该是你的答案:

$.tablesorter.addParser({
    id: 'monthYear',
    is: function(s) {
        return false;
    },
    format: function(s) {
        var date = s.match(/^(\w{3})[ ](\d{4})$/);
        var m = date[1];
        var y = date[2];
        return new Date(m + ' ' + 1 + ' ' + y);
    },
    type: 'date'
});

$(document).ready(function() {
    $('.tablesorter').tablesorter({
      headers: {
         1: {
            sorter: 'monthYear'
         }
      }
   });
});

它使用正则表达式提取月份缩写和年份,然后将它们转换为排序日期。

答案 1 :(得分:1)

我修改了@ SamTyson的回答:

有三件事发生了变化:

  1. 格式化函数需要能够处理空表格单元格。
  2. 格式化函数必须返回字符串或数字
  3. 解析器类型只能是“数字”或“文本”。
  4. 所以,我最终得到了这个解析器代码和this demo

    $.tablesorter.addParser({
        id: 'monthYear',
        is: function(s) {
            return false;
        },
        format: function(s) {
            // remove extra spacing
            s = $.trim(s.replace(/\s+/g, ' '));
            // process date
            var date = s.match(/^(\w{3})[ ](\d{4})$/),
                m = date ? date[1] + ' 1 ' || '' : '',
                y = date && date[2] ? date[2] || '' : '';
            return new Date(m + y).getTime() || '';
        },
        type: 'Numeric'
    });
    
    $('table').tablesorter({
        headers: {
            0: {
                sorter: 'monthYear'
            }
        }
    });
    

    更新:添加了一行以修剪额外的空格。