【问题标题】:jQuery DataTables datetime-moment is not parsing dates correctly, or at alljQuery DataTables datetime-moment 没有正确解析日期,或者根本没有
【发布时间】:2017-12-20 07:14:49
【问题描述】:

我已经使用 jQuery DataTables 插件构建了一个表。这是my broken Plunker。它有一列日期,我试图将其解析为MMMM YYYY 格式,但它根本不解析。我正在使用的插件是datetime-moment.js,它提供了以下示例:

$(document).ready(function() {
    $.fn.dataTable.moment( 'HH:mm MMM D, YY' );
    $.fn.dataTable.moment( 'dddd, MMMM Do, YYYY' );

    $('#example').DataTable();
});

我的代码不起作用,如下所示:

$(document).ready(function() {
    $.fn.dataTable.moment( 'MMMM YYYY' );
    $(".data-table").DataTable({
        data: tableData,
        columns: [{
            "data": recordCol
        }, 
        {
            "data": stateName
        }, 
        {
            "data": dateCol
        },
        {            
            "data": valCol  
        }]
    });

    d3.selectAll("thead th").each(function(d, i) {
        if (i === 0) {
            this.textContent = "record type";
        } else if (i === 1) {
            this.textContent = stateName;  
        } else if (i === 2) {
            this.textContent = "date"; 
        } else if (i === 3) {
            this.textContent = "treatment episodes";          
        }
    });  
}); //closes $(document).ready(function() {

谁能演示一个解决方案(这里又是my broken Plunker),以便该列正确解析并显示为MMMM YYYY 格式,并且按时间顺序正确排序?

【问题讨论】:

  • 在您提供的代码示例中,表格根本不会为我呈现。您确定这不仅仅是数据表配置问题吗?
  • 它在我这边显示得很好;它出现在页面底部的图表之后。
  • 看起来像是火狐的东西。在 chrome 中加载正常。
  • 在这里在 Firefox 中加载正常,但是一旦我找到解析日期列的解决方案,我会做笔记以进一步测试。

标签: javascript jquery datatable datatables momentjs


【解决方案1】:

您必须提及您从什么日期格式更改它。我已经分叉并更新了它here 进行检查。

您需要对您的plunker 进行以下更改。

将以下 js 作为 dataTableTime.js 添加到您的插件中。

(function( factory ) {
"use strict";

if ( typeof define === 'function' && define.amd ) {
    // AMD
    define( ['jquery'], function ( $ ) {
        return factory( $, window, document );
    } );
}
else if ( typeof exports === 'object' ) {
    // CommonJS
    module.exports = function (root, $) {
        if ( ! root ) {
            root = window;
        }

        if ( ! $ ) {
            $ = typeof window !== 'undefined' ?
                require('jquery') :
                require('jquery')( root );
        }

        return factory( $, root, root.document );
    };
}
else {
    // Browser
    factory( jQuery, window, document );
}
}
(function( $, window, document ) {


$.fn.dataTable.render.moment = function ( from, to, locale ) {
// Argument shifting
if ( arguments.length === 1 ) {
    locale = 'en';
    to = from;
    from = 'MMM D, Y h:mm:ss A';
}
else if ( arguments.length === 2 ) {
    locale = 'en';
}

return function ( d, type, row ) {
    var m = window.moment( d, from, locale, true );

    // Order and type get a number value from Moment, everything else
    // sees the rendered value
    return m.format( type === 'sort' || type === 'type' ? 'x' : to );
};
};
  }));

index.html中按以下顺序添加页面

<script src="dataTableTime.js"></script>
<script src="script.js"></script>

script.js 中删除或注释第 1118 行中的代码,即以下代码

$.fn.dataTable.moment( 'MMMM YYYY' );

通过添加columnDefs 来更改数据表代码如下

$(".data-table").DataTable({
    data: tableData,

    columns: [{
      "data": recordCol
    }, {
      "data": stateName
    }, {
     // "data": dateCol

        "data": dateCol//,
        //render: function(d){
        //    return moment(d).format("MMMM YYYY");
        //}          

    }, {            
      "data": valCol//"values[, ].y"  
    }],
    "columnDefs": [
      {
        "targets": 2,
        render: $.fn.dataTable.render.moment('EEE MMM DD YYYY hh:mm:ss TZD (zzz)', 'MMMM YYYY')
      }
    ]
  });

【讨论】:

    【解决方案2】:

    我对那个插件知之甚少,但是当我不久前使用数据表时,我确实找到了解决方案。您可以在要格式化的数据表列上添加渲染选项:

    columns: [{
          "data": recordCol
        }, {
          "data": stateName
        }, {
          "data": dateCol, render: function(d){
             return moment(d).format('MMMM YYYY');
             },
        }, {            
          "data": valCol  
        }]
    

    我知道这不是您想要的,但希望它有所帮助。

    【讨论】:

    • 我确实已经尝试过了(事实上,它在我的 Plunker 中被注释掉了,尽管我在我的问题中省略了它)。我相信您很熟悉您的建议的问题是日期排序不正确。 4 月的所有日期都排在第一位,9 月的日期排在最后。
    • 我最终切换到制表器,这对我来说感觉更容易使用。还有一个内置的日期排序选项。您可能想看看它:tabulator.info/docs/3.3#sorting
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多