DataTable最终日期/时间排序 - 使用自定义格式

时间:2018-05-17 15:34:54

标签: sorting date time datatable

有人可以帮帮我吗? 我尝试使用自定义排序格式进行数据处理,并使用"终极日期/时间排序"插入。 它部分起作用......我需要帮助才能使它完全正常工作。

我有一张桌子,其中一个名为" Laufzeit"将从票证中显示运行时间。我让我的sql数据库计算datetime字段和NOW()之间的差异。然后我使用javascript将客户端的格式转换为JSFiddle中可以看到的格式。

格式如下:6 Tage 09:47:15(天' 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/

1 个答案:

答案 0 :(得分:0)

'0'不是一年中有效的日期documentation。当它被解析为时刻日期时,日期将改为当前日期。这是一个例子:

let codec: AVVideoCodecType = AVVideoCodecType.h264
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

因此,为了支持一年中的0天,您需要编写一个自定义排序函数,它将解析您的输入并处理排序。我已经使用正则表达式(tests)编写了一些非常基本的示例,并将提供的日期添加到当前日期:

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.8.4/moment.min.js"></script>
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:"
  }, ],
});