我有一个jquery数据表,其日期列格式是2018年2月16日,但是当它被排序时,它没有正确排序。
我使用了Here
所有与日期相关的列类型但似乎没有任何作用。我该如何解决?
这是代码
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="panel-body btnsize">
<table class="table table-striped table-bordered dttable" id="JsDataTable" style="border-radius: 17px 17px 0 0; border-style: solid; border-color: #fcfdfa;" width:100%;>
<thead>
<tr>
<th style="width: 1px !important;" class="tblth">
Sr
</th>
<th class="tblth" style="width:13% !important;">
Date <i class="fa fa-fw fa-sort"></i>
</th>
</tr>
</thead>
<tbody class="dtbody tblth" style="color: #004D6B;">
</tbody>
</table>
</div>
var table = $("#JsDataTable").DataTable({
scrollY: '50vh',
scrollCollapse: true,
"aaData": response,
"pagingType": "full_numbers",
"dom": '<"top"i>rt<"bottom"flp><"clear">',
"sDom": 'Rfrtlip',
"bInfo": true,
"lengthMenu": [
[10, 20, 30, -1],
[10, 20, 30, "All"]
],
"columnDefs": [{
"searchable": false,
"orderable": false,
"targets": [0, 1, 2, 3, 4],
"type": 'natural'
}],
"order": [
[1, 'asc']
],
"aoColumns": [{
"mData": null
},
{
"mData": "Date",
'bSortable': true,
"sType": "natural"
},
],
"searching": true,
"paging": true,
"bAutoWidth": false,
"fixedColumns": false,
//order: [],
});
答案 0 :(得分:0)
问题可能出在columnDefs
作业中。
"columnDefs": [{
"searchable": false,
"orderable": false,
"targets": [0, 1, 2, 3, 4],
"type": 'natural'
}],
您正在使用术语"type": 'natural'
,这意味着在执行排序时,它只是按字母顺序对数据进行排序。
例如,日期Dec 16, 2018
实际上会被排序为小于Feb 16, 2018
,您可以通过简单的字符串比较来查看。
"Dec 16, 2018" < "Feb 16, 2018" = true
由于您使用的是moment.js,因此您需要调整columnDefs以使DateTime格式的列成为"type": "date"
。
"columnDefs": [
//non-date fields
{
"searchable": false,
"orderable": false,
"targets": [0, 2, 3, 4],
"type": 'natural'
},
//date-fields
{
"searchable": false,
"orderable": true,
"targets": 1,
"type": 'date'
}
],
此外,您不需要aoColumns
属性。 aoCoulumns
是columnDefs的旧版本。 aoColumns
中的所有信息都在columnDefs
属性中得到更好的表达。实际上,提供这两者也可能会导致您的问题,因为您以一种方式设置列属性,然后通过其他方式更改其工作方式。
以下是如何使用日期类型的简单示例。
$(document).ready( function () {
var table = $('#example').DataTable({
columnDefs: [{
"targets": 1,
"type": 'date',
}]
});
} );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://nightly.datatables.net/css/jquery.dataTables.css" rel="stylesheet" type="text/css" />
<script src="https://nightly.datatables.net/js/jquery.dataTables.js"></script>
<div class="container">
<table id="example" class="display nowrap" width="100%">
<thead>
<tr>
<th>id</th>
<th>Date</th>
</tr>
</thead>
<tfoot>
<tr>
<th>id</th>
<th>Date</th>
</tr>
</tfoot>
<tbody>
<tr>
<td>1</td>
<td>Dec 16, 2018</td>
</tr>
<tr>
<td>1</td>
<td>Jan 16, 2018</td>
</tr>
<tr>
<td>2</td>
<td>Feb 16, 2018</td>
</tr>
<tr>
<td>3</td>
<td>June 16, 2018</td>
</tr>
<tr>
<td>4</td>
<td>June 16, 2017</td>
</tr>
<tr>
<td>5</td>
<td>Dec 16, 2016</td>
</tr>
<tr>
<td>6</td>
<td>Jan 16, 2016</td>
</tr>
<tr>
<td>7</td>
<td>Feb 16, 2016</td>
</tr>
</tbody>
</table>
</div>
答案 1 :(得分:0)
你可以这样做:
在本演示中,我使用了ymdhis日期格式的一个不可见字段,并将 iDataSort 与下一个不可见字段一起传递,以便您的日期将使用该字段进行排序。
iDataSort属性用于您希望按另一列中包含的数据对一列进行排序的情况。第二列通常是隐藏的。
DEMO :https://codepen.io/creativedev/pen/OEgmdX
$(document).ready(function() {
var dataSet = [
["Test1", "25 Apr 2011", "20110425"],
["Test2", "10 Feb 2011", "20110210"],
["Test3", "20 Apr 2012", "20120420"],
["Test4", "16 Feb 2018", "20180216"],
];
var myTable;
myTable = $('#example').DataTable({
data: dataSet,
"order": [
[1, 'asc']
],
"aoColumns": [null, {
'iDataSort': 2
}, {
"bVisible": false
}]
});
});