Jquery 数据表排序不适用于日期列?
Jquery datatable Sort not working for Date Column?
我有一个 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: [],
});
问题可能出在您的 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>
你可以这样做:
在这个演示中,我采用了一个 ymdhis 日期格式的不可见字段,并将 iDataSort 传递给下一个不可见字段,这样您的日期将按该字段排序。
iDataSort 属性 用于您希望一列按另一列中包含的数据排序的情况。第二列通常是隐藏的。
演示: 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
}]
});
});
这个答案有效:
var table = $('#table');
table = table.DataTable({
columns: [
{ data: "link" },
{ data: "code" },
{ data: "entryDateTime" }
],
columnDefs: [
{
targets: 2,
render: function (data, type) {
if (type == "display") {
var date = new Date(data);
var options = { year: "numeric", month: "long", day: "numeric", hour: "numeric", minute: "numeric" };
return date.toLocaleDateString('tr-TR', options);
}
return data;
}
}
],
order: [[2, "desc"]] // default order when page loaded
});
我有一个 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: [],
});
问题可能出在您的 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>
你可以这样做:
在这个演示中,我采用了一个 ymdhis 日期格式的不可见字段,并将 iDataSort 传递给下一个不可见字段,这样您的日期将按该字段排序。
iDataSort 属性 用于您希望一列按另一列中包含的数据排序的情况。第二列通常是隐藏的。
演示: 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
}]
});
});
这个答案有效:
var table = $('#table');
table = table.DataTable({
columns: [
{ data: "link" },
{ data: "code" },
{ data: "entryDateTime" }
],
columnDefs: [
{
targets: 2,
render: function (data, type) {
if (type == "display") {
var date = new Date(data);
var options = { year: "numeric", month: "long", day: "numeric", hour: "numeric", minute: "numeric" };
return date.toLocaleDateString('tr-TR', options);
}
return data;
}
}
],
order: [[2, "desc"]] // default order when page loaded
});