如何使用 DataTables jquery 插件按日期排序?

问题描述 投票:0回答:13

我正在使用 datatables jquery 插件并想按日期排序。

我知道他们有一个插件,但我找不到从哪里实际下载它

http://datatables.net/plug-ins/sorting

我相信我需要这个文件:dataTables.numericComma.js,但我在任何地方都找不到它,当我下载数据表时,它似乎不在 zip 文件中。

我也不确定是否需要制作自己的自定义日期排序器以传递到此插件中。

我正在尝试对这种格式进行排序 MM/DD/YYYY HH:MM TT(AM |PM)

谢谢

编辑

如何更改此设置以按 MM/DD/YYYY HH:MM TT(AM |PM) 排序并将其更改为美国日期?

jQuery.fn.dataTableExt.oSort['uk_date-asc']  = function(a,b) {
    var ukDatea = a.split('/');
    var ukDateb = b.split('/');

    var x = (ukDatea[2] + ukDatea[1] + ukDatea[0]) * 1;
    var y = (ukDateb[2] + ukDateb[1] + ukDateb[0]) * 1;

    return ((x < y) ? -1 : ((x > y) ?  1 : 0));
};

jQuery.fn.dataTableExt.oSort['uk_date-desc'] = function(a,b) {
    var ukDatea = a.split('/');
    var ukDateb = b.split('/');

    var x = (ukDatea[2] + ukDatea[1] + ukDatea[0]) * 1;
    var y = (ukDateb[2] + ukDateb[1] + ukDateb[0]) * 1;

    return ((x < y) ? 1 : ((x > y) ?  -1 : 0));
};
javascript jquery datatables jquery-plugins
13个回答
136
投票

日期排序 - 带有隐藏元素

将日期转换为格式 YYYYMMDD 并在 <td> 中添加实际值 (

MM/DD/YYYY
),将其包装在元素中,为元素设置样式
display:none;
。现在日期排序将像普通排序一样工作。同样可以应用于日期时间排序。

HTML

<table id="data-table">
   <tr>
     <td><span>YYYYMMDD</span>MM/DD/YYYY</td>
   </tr>
</table>

CSS

#data-table span {
    display:none; 
}

128
投票

您应该使用 HTML5 数据属性。 https://www.datatables.net/examples/advanced_init/html5-data-attributes.html

只需将 data-order 元素添加到您的 td 元素
无需插件。

<table class="table" id="exampleTable">
    <thead>
        <tr>
            <th>Firstname</th>
            <th>Sign Up Date</th>
        </tr>
    </thead>

    <tbody>

        <tr>
            <td>Peter</td>
            <td data-order="2015-11-13 12:00">13. November 2015</td>
        </tr>
        <tr>
            <td>Daniel</td>
            <td data-order="2015-08-06 13:44">06. August 2015</td>
        </tr>
        <tr>
            <td>Michael</td>
            <td data-order="2015-10-14 16:12">14. October 2015</td>
        </tr>
    </tbody>
</table>


<script>
    $(document).ready(function() {
        $('#exampleTable').DataTable();
    });
</script>

18
投票

单击日期(日/月/年)下的“显示详细信息”链接,然后您可以复制并粘贴那里提供的插件代码


更新:我认为你可以切换数组的顺序,如下所示:

jQuery.fn.dataTableExt.oSort['us_date-asc']  = function(a,b) {
    var usDatea = a.split('/');
    var usDateb = b.split('/');

    var x = (usDatea[2] + usDatea[0] + usDatea[1]) * 1;
    var y = (usDateb[2] + usDateb[0] + usDateb[1]) * 1;

    return ((x < y) ? -1 : ((x > y) ?  1 : 0));
};

jQuery.fn.dataTableExt.oSort['us_date-desc'] = function(a,b) {
    var usDatea = a.split('/');
    var usDateb = b.split('/');

    var x = (usDatea[2] + usDatea[0] + usDatea[1]) * 1;
    var y = (usDateb[2] + usDateb[0] + usDateb[1]) * 1;

    return ((x < y) ? 1 : ((x > y) ?  -1 : 0));
};

我所做的只是切换

__date_[1]
(日)和
__date_[0]
(月),并将
uk
替换为
us
,这样你就不会感到困惑。我认为这应该会帮你解决。


更新 #2:您应该能够仅使用日期对象进行比较。试试这个:

jQuery.fn.dataTableExt.oSort['us_date-asc']  = function(a,b) {
 var x = new Date(a),
     y = new Date(b);
 return ((x < y) ? -1 : ((x > y) ?  1 : 0));
};

jQuery.fn.dataTableExt.oSort['us_date-desc'] = function(a,b) {
 var x = new Date(a),
     y = new Date(b);
 return ((x < y) ? 1 : ((x > y) ?  -1 : 0));
};

10
投票

我意识到这是一个两年前的问题,但我仍然发现它很有用。我最终使用了 Fudgey 提供的示例代码,但有一个小的修改。节省了我一些时间,谢谢!

jQuery.fn.dataTableExt.oSort['us_date-asc']  = function(a,b) { 
  var x = new Date($(a).text()),
  y = new Date($(b).text());
  return ((x < y) ? -1 : ((x > y) ?  1 : 0)); 
}; 

jQuery.fn.dataTableExt.oSort['us_date-desc'] = function(a,b) { 
  var x = new Date($(a).text()),
  y = new Date($(b).text());
  return ((x < y) ? 1 : ((x > y) ?  -1 : 0)); 
}; 

5
投票

截至 2015 年,据我所知,对数据表中的日期列进行排序的最方便方法是使用必需的排序插件。由于我的例子中的日期格式是

dd/mm/yyyy hh:mm:ss
,我最终使用了 date-euro 插件。 一个人需要做的就是:

第 1 步: 包含排序插件 JavaScript 文件 或代码;

第 2 步: 添加

columnDefs
(如下所示)以定位适当的列。

$('#example').dataTable( {
    columnDefs: [
       { type: 'date-euro', targets: 0 }
    ]
});

5
投票

仅适用于预加载的html表格,如果您使用ajax,这不是答案

数据表只能按“ISO-8601”格式的“日期时间”排序,因此您必须将“日期顺序”中的日期转换为这种格式(例如使用 Razor): <td data-sort="@myDate.ToString("o")">@myDate.ToShortDateString() - @myDate.ToShortTimeString()</td>



3
投票

我也从 jquery 扩展中获得了这段代码,并对其进行了一些更改以满足我的要求。你也应该这样做:)干杯!

function trim(str) { str = str.replace(/^\s+/, ''); for (var i = str.length - 1; i >= 0; i--) { if (/\S/.test(str.charAt(i))) { str = str.substring(0, i + 1); break; } } return str; } jQuery.fn.dataTableExt.oSort['uk-date-time-asc'] = function(a, b) { if (trim(a) != '' && a!="&nbsp;") { if (a.indexOf(' ') == -1) { var frDatea = trim(a).split(' '); var frDatea2 = frDatea[0].split('/'); var x = (frDatea2[2] + frDatea2[1] + frDatea2[0]) * 1; } else { 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 = 10000000; // = l'an 1000 ... } if (trim(b) != '' && b!="&nbsp;") { if (b.indexOf(' ') == -1) { var frDateb = trim(b).split(' '); frDateb = frDateb[0].split('/'); var y = (frDateb[2] + frDateb[1] + frDateb[0]) * 1; } else { var frDateb = trim(b).split(' '); var frTimeb = frDateb[1].split(':'); frDateb = frDateb[0].split('/'); var y = (frDateb[2] + frDateb[1] + frDateb[0] + frTimeb[0] + frTimeb[1] + frTimeb[2]) * 1; } } else { var y = 10000000; } var z = ((x < y) ? -1 : ((x > y) ? 1 : 0)); return z; }; jQuery.fn.dataTableExt.oSort['uk-date-time-desc'] = function(a, b) { if (trim(a) != '' && a!="&nbsp;") { if (a.indexOf(' ') == -1) { var frDatea = trim(a).split(' '); var frDatea2 = frDatea[0].split('/'); var x = (frDatea2[2] + frDatea2[1] + frDatea2[0]) * 1; } else { 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 = 10000000; } if (trim(b) != '' && b!="&nbsp;") { if (b.indexOf(' ') == -1) { var frDateb = trim(b).split(' '); frDateb = frDateb[0].split('/'); var y = (frDateb[2] + frDateb[1] + frDateb[0]) * 1; } else { var frDateb = trim(b).split(' '); var frTimeb = frDateb[1].split(':'); frDateb = frDateb[0].split('/'); var y = (frDateb[2] + frDateb[1] + frDateb[0] + frTimeb[0] + frTimeb[1] + frTimeb[2]) * 1; } } else { var y = 10000000; } var z = ((x < y) ? 1 : ((x > y) ? -1 : 0)); return z; };



2
投票

天数 = 1 (d/MM/YYYY) 而不是 (dd/MM/YYYY)
  • 空日期
  • 这是避免这些问题的解决方案:

jQuery.fn.dataTableExt.oSort['uk_date-asc'] = function (a, b) { var ukDatea = a.split('/'); var ukDateb = b.split('/'); //Date empty if (ukDatea[0] == "" || ukDateb[0] == "") return 1; //need to change Date (d/MM/YYYY) into Date (dd/MM/YYYY) if(ukDatea[0]<10) ukDatea[0] = "0" + ukDatea[0]; if(ukDateb[0]<10) ukDateb[0] = "0" + ukDateb[0]; var x = (ukDatea[2] + ukDatea[1] + ukDatea[0]) * 1; var y = (ukDateb[2] + ukDateb[1] + ukDateb[0]) * 1; return ((x < y) ? -1 : ((x > y) ? 1 : 0)); }; //Sorting by Date jQuery.fn.dataTableExt.oSort['uk_date-desc'] = function (a, b) { var ukDatea = a.split('/'); var ukDateb = b.split('/'); //Date empty if (ukDatea[0] == "" || ukDateb[0] == "") return 1; //MANDATORY to change Date (d/MM/YYYY) into Date (dd/MM/YYYY) if(ukDatea[0]<10) ukDatea[0] = "0" + ukDatea[0]; if(ukDateb[0]<10) ukDateb[0] = "0" + ukDateb[0]; var x = (ukDatea[2] + ukDatea[1] + ukDatea[0]) * 1; var y = (ukDateb[2] + ukDateb[1] + ukDateb[0]) * 1; return ((x < y) ? 1 : ((x > y) ? -1 : 0)); };



2
投票

var myTable = $("#myTable").dataTable({ columns: [ { data: "id" }, { data: "date", "orderData": 4 }, { data: "name" }, { data: "total" }, { data: "dateOrder", visible: false } ] });



2
投票
https://datatables.net/blog/2014-12-18

一种非常简单的方法来集成按日期订购。

<script type="text/javascript" charset="utf8" src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.8.4/moment.min.js"></script> <script type="text/javascript" charset="utf8" src="https://cdn.datatables.net/plug-ins/1.10.19/sorting/datetime-moment.js"></script>

在初始化数据表之前放入此代码:

$(document).ready(function () { // ...... $.fn.dataTable.moment('DD-MMM-YY HH:mm:ss'); $.fn.dataTable.moment('DD.MM.YYYY HH:mm:ss'); // And any format you need }



2
投票
type

指定为

type: 'date'
:

{title: 'Expiration Date', data: 'ExpirationDate', type: 'date'}

    


0
投票

<td><span><%= item.StartICDate %></span></td>.

我使用的日期格式是 dd/MM/YYYY。在 Datatables1.9.0 中测试


0
投票

jQuery.fn.dataTableExt.oSort['us_date-asc'] = function (a, b) { var x = new Date(a), y = new Date(b); return ((x < y) ? -1 : ((x > y) ? 1 : 0)); }; jQuery.fn.dataTableExt.oSort['us_date-desc'] = function (a, b) { var x = new Date(a), y = new Date(b); return ((x < y) ? 1 : ((x > y) ? -1 : 0)); }; $('#tblPoSetupGrid').dataTable({ columnDefs: [ { type: 'us_date', targets: 3 }, { type: 'us_date', targets: 1 } ] });

© www.soinside.com 2019 - 2024. All rights reserved.