我正在使用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));
};
答案 0 :(得分:125)
将日期转换为格式 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;
}
答案 1 :(得分:96)
您应该使用HTML5数据属性。 https://www.datatables.net/examples/advanced_init/html5-data-attributes.html
只需将数据顺序元素添加到 td元素。
无需插件。
Enable 32-Bit Applications
答案 2 :(得分:17)
点击日期(dd / mm / YYY)下的“显示详情”链接,然后您可以复制并粘贴此处提供的插件代码
更新:我认为您可以切换数组的顺序,如下所示:
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));
};
答案 3 :(得分:10)
我意识到这是一个两年前的问题,但我仍然发现它很有用。我最终使用了Fudgey提供的示例代码但是使用了一个小mod。节省了一些时间,谢谢!
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));
};
答案 4 :(得分:5)
截至2015年,根据我在DataTable中对Date列进行排序的最方便方法是使用required sort plugin。由于我的案例中的日期格式为dd/mm/yyyy hh:mm:ss
,因此我最终使用了date-euro plugin。
所有人需要做的是:
第1步:包括排序插件JavaScript file或代码;
第2步:如下所示添加columnDefs
以定位相应的列。
$('#example').dataTable( {
columnDefs: [
{ type: 'date-euro', targets: 0 }
]
});
答案 5 :(得分:4)
数据表只能按 DateTime以“ISO-8601”格式排序,因此您必须将“日期顺序”中的日期转换为此格式(使用Razor的示例):
<td data-sort="@myDate.ToString("o")">@myDate.ToShortDateString() - @myDate.ToShortTimeString()</td>
答案 6 :(得分:3)
如果有人遇到日期值或单元格中有空格的问题,则必须处理这些位。有时来自html的trim函数不会处理空白空间,就像“$ nbsp;”。如果你不处理这些,你的排序将无法正常工作,并会在有空格的地方打破。
我也从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!=" ") {
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!=" ") {
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!=" ") {
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!=" ") {
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;
};
答案 7 :(得分:2)
关于更新#1,有2个问题:
这是避免这些问题的解决方案:
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));
};
答案 8 :(得分:0)
我在整天工作后得到了解决方案。这是一个小hacky解决方案在td标签内添加了跨度
^[^0](?!.*[*& ])
我使用的日期格式是dd / MM / YYYY。在Datatables1.9.0中测试
答案 9 :(得分:0)
创建一个隐藏的列“ dateOrder”(例如),日期为字符串,格式为“ yyyyMMddHHmmss”,并使用属性“ orderData”指向该列。
var myTable = $("#myTable").dataTable({
columns: [
{ data: "id" },
{ data: "date", "orderData": 4 },
{ data: "name" },
{ data: "total" },
{ data: "dateOrder", visible: false }
] });
答案 10 :(得分:0)
关注链接 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
}
答案 11 :(得分:0)
将列的类型指定为日期:
title: 'Expiration Date',
data: 'ExpirationDate',
type: "date"
答案 12 :(得分:0)
我的表格中有10列,并且有2列日期,第2列和第4列是美国日期,所以这对我来说很好。只需将此代码最后以相同顺序粘贴到脚本部分中即可。
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 }
]
});