sorting - DataTable 最终日期/时间排序 - 使用自定义格式
问题描述
有人能帮帮我吗?我正在尝试通过“最终日期/时间排序”插件对数据使用自定义排序格式。它部分工作......我需要帮助才能让它完全工作。
我有一张桌子,其中一个名为“Laufzeit”的列将显示一张票的运行时间。我让我的 sql 数据库计算日期时间字段和 NOW() 之间的差异。然后我使用 javascript 将客户端的格式转换为您可以在 JSFiddle 中看到的格式。
格式是这样的:6 Tage 09:47:15 (days 'Tage' 时:分:秒)
对于排序,我正在尝试这个:https ://datatables.net/blog/2014-12-18 它到目前为止工作,除了一件小事......当数据显示“0天”时,它被排序到最后一个位置,而不是第一个位置。其余的排序是正确的。
有人可以帮我吗?谢谢。:)
borsTiHD
<table class="dataTable" id="example"><tbody>
<tr>
<td>0 Tage 00:33:21</td>
</tr>
<tr>
<td>1 Tage 02:39:24</td>
</tr>
<tr>
<td>1 Tage 03:18:25</td>
</tr>
<tr>
<td>1 Tage 03:47:15</td>
</tr>
<tr>
<td>2 Tage 06:47:15</td>
</tr>
<tr>
<td>3 Tage 08:47:15</td>
</tr>
<tr>
<td>4 Tage 18:47:15</td>
</tr>
<tr>
<td>6 Tage 09:47:15</td>
</tr>
<tr>
<td>13 Tage 05:26:59</td>
</tr>
<tr>
<td>13 Tage 18:24:24</td>
</tr>
<tr>
<td>20 Tage 12:12:13</td>
</tr>
<tr>
<td>21 Tage 18:24:56</td>
</tr>
<tr>
<td>34 Tage 22:59:59</td>
</tr>
<tr>
<td>0 Tage 00:11:06</td>
</tr>
<tr>
<td>0 Tage 00:24:22</td>
</tr>
</tbody></table>
<script>
$.fn.dataTable.moment( 'DDD [Tage] HH:mm:ss' );
Table = $("#example").DataTable( {
paging: false,
searching: false,
responsive: true,
"bInfo" : true,
"ordering": true,
"columns": [
{ title: "Laufzeit:" },
],
});
</script>
PS:我的小提琴: https ://jsfiddle.net/borsTiHD/Lcnaq5gu/
解决方案
'0' 不是按时刻的有效日期。当它被解析为时刻日期时,日期将改为当前日期。这是一个例子:
console.log(moment('1 Tage 01:20:35', 'DDD [Tage] HH:mm:ss').format()) // 1st january
console.log(moment('15 Tage 01:20:35', 'DDD [Tage] HH:mm:ss').format()) // 15th january
console.log(moment('32 Tage 01:20:35', 'DDD [Tage] HH:mm:ss').format()) // 1st february
console.log(moment('0 Tage 01:20:35', 'DDD [Tage] HH:mm:ss').format()) // current date
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.8.4/moment.min.js"></script>
因此,要支持一年中的第 0 天,您需要编写一个自定义排序函数,该函数将解析您的输入并处理排序。我使用正则表达式(测试)编写了一些非常基本的示例,并将提供的日期添加到当前日期:
var types = $.fn.dataTable.ext.type;
// Add type detection
types.detect.unshift(function(d) {
return parseDate(d) ? 'custom-moment' : null;
});
// Add sorting method - use an integer for the sorting
types.order['custom-moment-pre'] = function(d) {
return moment().add(parseDate(d)).unix();
};
function parseDate(d) {
//Format: DDD [Tage] HH:mm:ss
var parsedDate = d.match(/^\s*(\d+) Tage (\d+):(\d+):(\d+)\s*$/);
if (!parsedDate) {
return undefined;
}
return {
days: parsedDate[1],
hours: parsedDate[2],
minutes: parsedDate[3],
seconds: parsedDate[4]
}
}
Table = $("#example").DataTable({
paging: false,
searching: false,
responsive: true,
"bInfo": true,
"ordering": true,
"columns": [{
title: "Laufzeit:"
}, ],
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script type="text/javascript" src="https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.8.4/moment.min.js"></script>
<link rel="stylesheet" href="https://cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css">
<table class="dataTable" id="example"><tbody>
<tr>
<td>0 Tage 00:33:21</td>
</tr>
<tr>
<td>1 Tage 02:39:24</td>
</tr>
<tr>
<td>1 Tage 03:18:25</td>
</tr>
<tr>
<td>1 Tage 03:47:15</td>
</tr>
<tr>
<td>2 Tage 06:47:15</td>
</tr>
<tr>
<td>3 Tage 08:47:15</td>
</tr>
<tr>
<td>4 Tage 18:47:15</td>
</tr>
<tr>
<td>6 Tage 09:47:15</td>
</tr>
<tr>
<td>13 Tage 05:26:59</td>
</tr>
<tr>
<td>13 Tage 18:24:24</td>
</tr>
<tr>
<td>20 Tage 12:12:13</td>
</tr>
<tr>
<td>21 Tage 18:24:56</td>
</tr>
<tr>
<td>34 Tage 22:59:59</td>
</tr>
<tr>
<td>0 Tage 00:11:06</td>
</tr>
<tr>
<td>0 Tage 00:24:22</td>
</tr>
</tbody></table>
推荐阅读
- python - Taking an Arbitrary Power for a Keras Loss Function
- github - 使用 GitHub Action 收集代码覆盖率
- focus - 按下按钮时如何关注特定元素
- javascript - How can I put a Header Component above the TopTabNavigator?
- java - 验证未使用 PDFBox 更改的 pdf 内容
- php - Wordpress - 将 div 添加到 index.php 文件
- angular - 连接贝宝帐户以获取访问令牌时的错误请求
- powerbi - Power BI 网格未显示在右侧
- python - Python 类型行然后循环它们直到行不在 txt 文件中
- c++ - 谁能解释一下这是如何产生一包一和零的?