2015-03-31 209 views
0

我正在使用datatable plugin版本1.8.2在我的網頁上顯示錶。jquery datatable日期排序問題

它工作正常除了。 日期對象未正確排序,它顯示「無效日期」。下面是我的代碼片段。

 $(document).ready(function() { 

       jQuery.fn.dataTableExt.oSort['usdate-asc'] = function(a,b) { 
    /* 
    a and b are <div> tag with date 
    */ 
        var texta = ($(a).text()).toString(); // Here I am able to see my date in ' 03-17-2015 12:25:21 AM ' format 
        var textb = ($(b).text()).toString();// Here I am able to see my date in ' 03-17-2015 12:25:21 AM ' format 

        var usDatea = new Date(Date.parse(texta)); // Here it is showing "invalid date" 
        var usDateb = new Date(Date.parse(textb)); 

        return ((usDatea < usDateb) ? -1 : ((usDatea > usDateb) ? 1 : 0)); 
       }; 

       jQuery.fn.dataTableExt.oSort['usdate-desc'] = function(a,b) { 
/* 
    a and b are <div> tag with date 
    */ 
        var texta = ($(a).text()).toString(); //same as above 
        var textb = ($(b).text()).toString(); //same as above 

        var usDatea = new Date(Date.parse(texta)); //same as above 
        var usDateb = new Date(Date.parse(textb)); //same as above 

        return ((usDatea < usDateb) ? 1 : ((usDatea > usDateb) ? -1 : 0)); 
       }; 

       $('#tablegridname').dataTable({ 
        "sPaginationType": 'full_numbers', 
        "bJQueryUI": true, 
        "iDisplayLength": 50, 
        "aLengthMenu":[50,100,500,1000], 
        "aaSorting": [[ 4, 'desc' ]], 
        "aoColumns": [null, null, null, null, {"sType": "usdate"}] 
       }); 

      }); 
      }); 
+0

日期如何?這聽起來像是你有一些日期格式爲'Data.parse()'不能識別。順便說一句 - 你應該考慮將你的數據表版本升級到至少1.9.4版本。 – davidkonrad 2015-04-01 12:34:17

+1

你的問題是你的日期(03-17-2015 12:25:21 AM)沒有被接受的格式。你的日期是01-02-2015你期望什麼行爲? 1月2日(美國)或2月1日(世界大部分地區)?看看這裏,並嘗試以這種格式得到你的日期:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse – 2015-04-01 16:13:25

+0

@davidkonrad我不能這樣做。因爲一切工作正常,除了日期排序和客戶端不會除了:( – user3035305 2015-04-01 17:45:49

回答

1

試試這個小提琴:

http://jsfiddle.net/82vh6mp2/

它使用這個簡單的功能:

function parseDateForSort(d) 
    { 
     return d.substring(6,10) + d.substring(0,2) + 
      d.substring(3,5) + d.substring(20) + 
      d.substring(11,19); 
    } 

功能利用的是,幸運的是,PM自帶AM字母后的事實;因此在字符串中間的「d.substring(20)」。所以我們有YYYYMMDD [AM或PM] HH:MM:SS。

在你的代碼可以擺脫Date.parse,並替換你的回報:

usDatea = parseDateForSort(texta); 
    usDateb = parseDateForSort(textb); 

    return ((usDatea < usDateb) ? -1 : ((usDatea > usDateb) ? 1 : 0)); 

好運。

附錄:

您可以創建自己的排序類型,然後正是如此指定列:

$.extend($.fn.dataTableExt.oSort, { 
    "date-us-pre": function (v) { 
     return parseDateForSort(v); 
    }, 

    "date-us-asc": function (a, b) { return a - b; }, 
    "date-us-desc": function (a, b) { return b - a; } 
});  

,然後在.dataTable調用包括 "aoColumnDefs": [ { "sType":"date-us", "aTargets":[6] } ]

或什麼列數是它而不是6.