数据表日期排序dd/mm/yyyy问题

jag*_*get 58 jquery datatables date-sorting

我正在使用一个名为datatables的Jquery插件

它太棒了,但根据dd/mm/yyyy格式,我无法正确排序日期.

我查看了他们的支持格式,但这些修复似乎都不起作用.

有人可以帮我吗?

Zah*_*med 113

jQuery解决方案

这是工作jQuery解决方案.

jQuery.extend( jQuery.fn.dataTableExt.oSort, {
"date-uk-pre": function ( a ) {
    var ukDatea = a.split('/');
    return (ukDatea[2] + ukDatea[1] + ukDatea[0]) * 1;
},

"date-uk-asc": function ( a, b ) {
    return ((a < b) ? -1 : ((a > b) ? 1 : 0));
},

"date-uk-desc": function ( a, b ) {
    return ((a < b) ? 1 : ((a > b) ? -1 : 0));
}
} );
Run Code Online (Sandbox Code Playgroud)

将上面的代码添加到脚本中,并将具有Date值{ "sType": "date-uk" }和其他值的特定列设置为null,请参见下文:

$(document).ready(function() {
    $('#example').dataTable( {
        "aoColumns": [
            null,
            null,
            null,
            null,
            { "sType": "date-uk" },
            null
        ]
    });
    });
Run Code Online (Sandbox Code Playgroud)

CSS解决方案

如果你想要一个快速的解决方案,你可以在特定格式(YYYYMMDD)的每一行中附加实际的DateTime值,并使用CSS隐藏它,它将允许您在没有任何javascript更改的情况下对该列进行排序.

这是工作CSS解决方案

HTML

<td data-sort='YYYYMMDD'>DD/MM/YYYY</td>
Run Code Online (Sandbox Code Playgroud)

CSS

jQuery.extend( jQuery.fn.dataTableExt.oSort, {
"date-uk-pre": function ( a ) {
    var ukDatea = a.split('/');
    return (ukDatea[2] + ukDatea[1] + ukDatea[0]) * 1;
},

"date-uk-asc": function ( a, b ) {
    return ((a < b) ? -1 : ((a > b) ? 1 : 0));
},

"date-uk-desc": function ( a, b ) {
    return ((a < b) ? 1 : ((a > b) ? -1 : 0));
}
} );
Run Code Online (Sandbox Code Playgroud)

  • 如果要将日期排序为字符串而不是数字,则必须删除“date-uk-pre”函数末尾的“* 1”,该函数会将返回的日期转换为数字。有了这个变化,玩起来就像魅力一样!:) (2认同)
  • 这是一个优雅的修复 (2认同)
  • css 解决方案更好,tjhanks (2认同)

Anu*_*l S 74

日期排序 - 带有隐藏元素

将日期转换为YYYYMMDD格式并添加到实际值(DD/MM/YYYY)中<td>,将其包装在元素中,将样式设置display:none;为元素.现在日期排序将作为正常排序.同样可以应用于日期时间排序.

HTML

<table id="data-table">
   <tr>
     <td><span>YYYYMMDD</span>DD/MM/YYYY</td>
   </tr>
</table>
Run Code Online (Sandbox Code Playgroud)

CSS

#data-table span {
    display:none; 
}
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,当你使用datatables export pdf插件时,它会带你所有的`HTML`标签(包括hideen`HTML`标签).结果是导出文件中的数据重复.它也会导出`<span>`中的数据 (5认同)
  • 除此以外,OMG没有任何作用。如果使用rails,这应该是您需要的代码(idea只是我使用的模型名称):`&lt;td&gt; &lt;span&gt; &lt;%= idea.created_at.strftime(“%Y%m%d”)% &gt; &lt;/ span&gt; &lt;%= idea.created_at.strftime(“%d /%m /%Y”)%&gt; &lt;/ td&gt;` (2认同)

max*_*777 32

我知道这是一个老问题,答案也很老.最近我遇到了一种简单而干净的日期排序方式.它可以通过HTML5 data-order属性来完成<td>.

这是我在PHP中所做的:

<?php
$newdate = date('d M Y', $myDateTime); // Format in which I want to display
$dateOrder = date('Y-m-d', $myDateTime); // Sort Order
?>

<td data-order="<?php echo $dateOrder; ?>" >
<?php echo $newdate; ?>
</td>
Run Code Online (Sandbox Code Playgroud)

  • 可以在此处找到此功能的文档:https://datatables.net/release-datatables/examples/advanced_init/html5-data-attributes.html (2认同)

Rey*_*gle 11

这样它对我有用。

<td data-order="@item.CreatedOn.ToString("MMddyyyyHHmmss")">
    @item.CreatedOn.ToString("dd-MM-yyyy hh:mm tt")
</td>
Run Code Online (Sandbox Code Playgroud)

data-order属性中的此日期格式应采用 DataTable 支持的此格式。


小智 9

试试这个插件.

如上所述,您需要包含Moment.js和datatable-moment插件,然后只声明您正在使用的日期格式.该插件将自动检测您的日期列并按照它应该排序.对于moment.js格式说明,请在此处查看.

例:

$(document).ready(function() {
    $.fn.dataTable.moment('DD/MM/YYYY HH:mm');
    $('#example').DataTable();
});
Run Code Online (Sandbox Code Playgroud)


Che*_*som 5

如果您不想使用momentum.js 或任何其他日期格式,您可以在日期值中添加以毫秒为单位的日期格式,以便根据毫秒进行排序。并隐藏毫秒日期格式。

示例代码:

var date = new Date();
var millisecond = Date.parse(date);
Run Code Online (Sandbox Code Playgroud)

HTML

<td>'<span style="display: none;">' + millisecond + "</span>" + date + </td>
Run Code Online (Sandbox Code Playgroud)

就是这样。