【问题标题】:How to sort date with dd-MMM-yyyy hh:mm tt format in datatable如何在数据表中使用 dd-MMM-yyyy hh:mm tt 格式对日期进行排序
【发布时间】:2017-12-12 04:50:55
【问题描述】:

我目前正在处理数据表,我发现我的日期列排序不起作用。这是我的截图

这是我的代码

<table id="tbl" class="table table-small-font table-bordered table-striped">
  <thead>
    <tr>
      <th>&nbsp;</th>
      <th class="text-left">Dated</th>
      <th class="text-left">Day</th>
      <th class="text-center">Remarks</th>
      <th class="text-center">State</th>
      <th class="text-center"></th>
    </tr>
  </thead>
  <tbody>
    @{ IEnumerable
    <PublicHoliday> PublicHolidays = (IEnumerable
      <PublicHoliday>)ViewData["PublicHolidays"]; int Idx = 1; } @foreach (var i in PublicHolidays) {
        <tr>
          <td>@Idx</td>
          <td>@i.Dated.ToString("dd-MMM-yyyy hh:mm tt")</td>
          <td>@i.Dated.ToString("ddd")</td>
          <td>@Html.DisplayFor(x => i.Remarks)</td>
          <td>@i.ForStateName</td>
          <td><a data-toggle="tooltip" title="Delete" onclick="DeleteRecord(@i.Id);"><span class="glyphicon glyphicon-remove"></span></a></td>
        </tr>
        Idx++; }
  </tbody>
</table>
<script src="~/lib/jquery-ui-1.12.1/jquery-ui.min.js"></script>
<script src="~/js/jquery.dataTables.min.js"></script>
<script src="~/js/dataTables.bootstrap.min.js"></script>
<script type="text/javascript">
  $(document).ready(function() {
    var tbl = $('#tbl').DataTable({
      dom: "<'row'<'col-sm-6 col-xs-7'l><'col-sm-6 col-xs-7'f>>" + "rtip",
      order: [
        [0, "asc"]
      ],
      pagingType: "numbers",
      iDisplayLength: 50
    });
  });
</script>

排序列根本不起作用,我无法从数据表中找到要使用的任何插件。任何人请帮忙..提前谢谢

【问题讨论】:

  • 也许您可以通过将日期转换为时间戳(长)来添加隐藏列,并按其排序,参考:stackoverflow.com/a/32669709/9041712
  • @Yu-LinChen,我也是这么建议的,我以前也做过很多次,长的比较容易处理。
  • 我可以知道代码的样子吗?
  • @LeeYuanYee,我在下面添加示例代码:stackoverflow.com/a/47775236/9041712

标签: javascript jquery datatables


【解决方案1】:

我不确定是否有任何插件支持date-dd-MMM-yyyy hh:mm tt format

所以我对插件进行了修改以支持这种格式。

这是它的代码。加载datatable插件后加载这段代码

   (function() {

       var customDateDDMMMYYYYToOrd = function(date) {
         var dateTime = date.split(' '),
           dateObj = new Date(dateTime[0].replace(/-/g, ' ')),
           time = "00:00",
           type = "AM";
         if (dateTime.length > 1) { // if time part and am/pm part is available
           time = dateTime[1],
             type = dateTime[2];
         }

         var splitTime = time.split(":"),
           hours = type == "PM" ? Number(splitTime[0]) + 12 : Number(splitTime[0]),
           minutes = Number(splitTime[1]),
           seconds = 0,
           milliseconds = 0;
         return new Date(dateObj.getFullYear(), dateObj.getMonth(), dateObj.getDate(), hours, minutes, seconds, milliseconds);
       };

       // This will help DataTables magic detect the "dd-MMM-yyyy" format; Unshift
       // so that it's the first data type (so it takes priority over existing)
       jQuery.fn.dataTableExt.aTypes.unshift(
         function(sData) {
           "use strict"; //let's avoid tom-foolery in this function
           if (/^([0-2]?\d|3[0-1])-(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)-\d{4}/i.test(sData)) {
             return 'date-dd-mmm-yyyy';
           }
           return null;
         }
       );

       // define the sorts
       jQuery.fn.dataTableExt.oSort['date-dd-mmm-yyyy-asc'] = function(a, b) {
         "use strict"; //let's avoid tom-foolery in this function
         var ordA = customDateDDMMMYYYYToOrd(a),
           ordB = customDateDDMMMYYYYToOrd(b);
         return (ordA < ordB) ? -1 : ((ordA > ordB) ? 1 : 0);
       };

       jQuery.fn.dataTableExt.oSort['date-dd-mmm-yyyy-desc'] = function(a, b) {
         "use strict"; //let's avoid tom-foolery in this function
         var ordA = customDateDDMMMYYYYToOrd(a),
           ordB = customDateDDMMMYYYYToOrd(b);
         return (ordA < ordB) ? 1 : ((ordA > ordB) ? -1 : 0);
       };

     })();

上面的代码是对date sort plugin(dd-mmm-yyyy)的修改。我已经修改了customDateDDMMMYYYYToOrd函数来适应这个具体的例子

添加这个,以便插件知道在日期排序时要使用什么

   var tbl = $('#tbl').DataTable({
    dom: "<'row'<'col-sm-6 col-xs-7'l><'col-sm-6 col-xs-7'f>>" + "rtip",
    order: [[0, "asc"]],
    pagingType: "numbers",
    pageLength: 50,
    columnDefs: [
      { type: 'date-dd-mmm-yyyy', targets: 1 } //add this part
    ]   
});

你可以找到datatablehere可用的排序插件列表

注意:

请注意,此插件已**弃用*。 datetime 插件提供增强的功能和灵活性

【讨论】:

  • 我可以知道一个数据表中是否有两种不同的日期格式。你将如何处理?一种日期格式是 dd-MMM-yyyy hh:mm tt,另一种是 dd-MMM-yyyy
  • @LeeYuanYee 如果 hh:mm 部分为空,将修改其排序的代码
  • 会是什么样子?
  • @LeeYuanYee 。已修改。请检查。
  • 不,它不会。所以这里我试图用空格分割它。正常情况下它会是 dd -MMM -yyyy hh:mm tt 它会被分割成 3。现在在我们的特殊情况下它只会有 dd-MMM-yyyy 部分
【解决方案2】:

由于02-Jan-2017 12:00 AM 等是有效的RFC2822 日期,您只需将列type 设置为date

columnDefs: [
  { targets: 1, type: 'date' }
]

或者,如果您在数据中有一些奇数值,例如 null 值,您可以将解析后的值传回并按数字排序,无论如何都要强制正确排序(我想这是真正的问题):

columnDefs: [
  { targets: 1, 
    type: 'num',
    render: function(data,type) {
      if (type == 'sort') return Date.parse( data ).valueOf() 
      return data
    }
  }
]

这里真的不需要特殊的排序插件。第三种选择是将未格式化的日期设置为自身的data-sort 属性

<td data-sort="@i.Dated.ToString()">@i.Dated.ToString("dd-MMM-yyyy hh:mm tt")</td>

【讨论】:

  • Sir,Date.parse('02-Jan-2017 12:00 AM') 在 ie 11 和 FF 57(Quantum) 中不起作用。但它在 Chrome 中起作用
【解决方案3】:

我用momentjs和lodash,它想:

var records = [
    ["1", "28-Jan-2017 12:00 AM"],
    ["1", "28-May-2017 12:00 AM"],
    ["1", "28-Mar-2017 12:00 AM"]
];

records = _.map(records, record => {
    record.push(moment(record[1], "DD-MMM-YYYY hh:mm A").unix());
    return record;
});

$(document).ready(function() {
    $('#example').DataTable( {
        data: records,
        columns: [
            { title: "id" },
            { title: "date" },
            { title: "ts"}
        ],
        'columnDefs': [
            { 'orderData':[2] },
            {
              'targets': [2],
              'visible': false
            },
        ],
    });
});

$(document).ready(function() {
    $('#example').DataTable( {
        data: records,
        columns: [
            { title: "id" },
            { title: "date" },
            { title: "ts"}
        ],
        'columnDefs': [
                    { 'orderData':[2] },
                    {
                    'targets': [2],
                    'visible': false
                    },
                ],
    });
});

这里是jsFiddle

【讨论】:

    【解决方案4】:

    您可以将以下排序方法添加到您的选项中,以根据日期和时间进行排序,特别是如果您的时间采用 12 小时 (AM/PM) 格式。我使用以下代码,它适用于我:

    $('#tableid').DataTable({ "order": [[, 'desc']],//按降序排列列。 “列定义”:[ { "type": "date", "targets": }//日期列格式为“03/23/2018 10:25:13 AM”。 ], “页面长度”:25 });

    【讨论】:

      猜你喜欢
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多