2014年12月18日,星期四

终极日期/时间排序插件

日期和时间可以用几乎无限的方式表示,使用不同的格式向最终用户显示数据点。例如,在空间不受限制的情况下,可以使用“2014年12月18日,星期四”这样的长格式,但根据您的位置,更简洁的格式可能是“18/12/2014”或“12/18/2014”!此类歧义在尝试对时间数据进行排序时会导致重大问题。

关于如何正确排序时间数据的疑问是论坛中的常见特征,在这篇文章中,我将介绍一个新的 DataTables 插件,该插件使您可以使用优秀的 Moment.js 库正确排序几乎任何日期/时间格式。

对灵活解决方案的需求

DataTables 内置了许多不同的数据类型检测和排序方法,包括货币、百分比值和日期。日期方法使用 Date() 对象(它是 Javascript 规范的一部分)来读取日期格式的数据。这是使用 Date.parse() 完成的,但是每个浏览器支持的日期格式差异很大。最初,Date 规范不要求支持任何特定格式(此后在 ECMAScript 5.1 中已更改为要求 ISO 8601),但所有浏览器都已趋于支持 ISO 8601,使其成为唯一可靠的格式。其他格式在浏览器之间是分别支持的。

尽管 ISO 8061 不含糊,但问题在于它很少是您希望向最终用户显示的格式。因此,多年来,许多用于排序特定日期/时间信息的插件已由各种作者 编写并贡献 给 DataTables 社区(也可以使用 正交数据)。

这样做的缺点是,对于格式的每一次细微变化,您都需要创建一个新的插件。为了解决这个问题,并提供完全的灵活性,我们需要能够指定 DataTables 将自动检测和排序的格式。

有许多库可以弥补 Date() 的不足,例如 SugarDatejsdate.format,但在此示例中,我们将使用 Moment.js,它提供了广泛的格式化选项(如果您愿意,也可以使用此帖子中介绍的技术使用任何其他库!)。

操作

使用此 DataTables“终极”日期/时间排序插件非常简单,只需将其(以及 Moment.js)包含在您的页面中即可 - 您可以使用 DataTables CDN 执行此操作(或将其连接到您的其他 Javascript 文件中,以 提高加载性能!)。

JS
JS

然后,使用 $.fn.dataTable.moment( format, locale ) 方法注册您希望 DataTables 检测和排序的日期/时间格式,该方法最多接受两个参数。

  1. format - 要检测和排序的日期/时间格式 - 可用的选项在 Moment.js 文档 中定义。
  2. locale可选) - Moment.js 具有 广泛的国际化支持。此选项可用于指定区域设置。

示例

考虑下面的 DataTable,其中包含两列日期。一列格式为 HH:mm MMM D, YY,另一列格式为 dddd, MMMM Do, YYYY(您通常不会使用两种如此不同的格式,但这只是一个示例!)。要创建 DataTable,我们使用上面定义的 $.fn.dataTable.moment() 函数和标准的 DataTables 创建

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

    $('#example').DataTable();
} );
姓名 公司 创建 更新
戴维克斯 欧基金会 14年10月18日 11:10 2015年5月16日,星期六
玉黛尔 坐 amet 公司 14年4月29日 07:04 2015年7月25日,星期六
梅兰妮·巴克纳 时间Lorem 有限公司 15年1月28日 02:01 2015年10月11日,星期日
赛勒斯·哈尼 阶段公司 14年1月28日 10:01 2013年12月28日,星期六
梅琳达·萨拉斯 摩尔塞德有限公司 14年5月1日 11:05 2015年5月15日,星期五
丽贝卡·克莱恩 埃格特·迪克图姆·普拉塞拉特有限公司 13年12月20日 02:12 2014年8月6日,星期三
印度·劳森 埃格特公司 15年3月21日 11:03 2014年7月11日,星期五
埃尔维斯·怀特菲尔德 莫里斯公司 15年7月30日 08:07 2015年2月28日,星期六
卡斯托·门罗 雅库利斯有限责任公司 14年6月22日 12:06 2014年6月2日,星期一
加雷斯·贝里 马勒苏达公司 14年2月26日 04:02 2015年2月27日,星期五
安妮·诺克斯 内克·塞德咨询 14年4月11日 04:04 2014年5月24日,星期六
卡西米尔·马丁 托特·努克咨询 14年12月24日 11:12 2015年7月25日,星期六
德雷克·普格 马蒂斯·韦利特工业 15年9月23日 03:09 2014年3月5日,星期三
卡拉·黑德 溢价阿里奎特研究所 15年9月2日 06:09 2014年1月8日,星期三
谢莉·亨利 斯塞勒里斯克有限公司 15年1月28日 11:01 2015年2月1日,星期日
帕特里克·科赫 斯塞勒里斯克·杜伊有限责任公司 14年10月3日 10:10 2015年5月17日,星期日
达拉·罗伯茨 乌尔纳·康瓦利斯·埃拉特工业 15年8月13日 11:08 2014年6月22日,星期日
尤利·赖特 作者咨询 14年7月22日 05:07 2014年3月25日,星期二
赛勒斯·詹森 艾特·里苏斯联合会 15年9月19日 10:09 2015年5月16日,星期六
霍姆斯·塔利 乌尔纳·努拉姆·洛伯蒂斯咨询 14年12月25日 01:12 2014年2月13日,星期四
艾里斯·卡弗 劳雷特·莱克图斯·奎斯有限责任公司 14年10月13日 12:10 2014年11月7日,星期五
勒罗伊·坎特雷尔 在有限责任公司 15年5月5日 03:05 2015年6月2日,星期二
玛吉·阿吉拉尔 毛里斯个人电脑 14年12月7日 02:12 2014年11月20日,星期四
玛吉·波特 毛里斯·布兰迪特有限公司 14年6月4日 11:06 2014年11月11日,星期二
自由华纳 伊普苏姆公司 15年11月17日 05:11 2015年10月5日,星期一
拉亚·迪恩 费利斯基金会 14年12月18日 02:12 2014年2月10日,星期一
杰克·胡阿雷斯 努克有限公司 15年9月7日 01:09 2014年12月22日,星期一
诺拉·金 瓦里乌斯·奥西公司 15年5月12日 04:05 2014年6月24日,星期二
卡洛斯·霍尔曼 奥迪奥有限责任公司 15年8月16日 01:08 2015年8月20日,星期四
阿奎拉·芬奇 埃格斯塔斯·利古拉·努拉姆研究所 15年9月3日 12:09 2014年3月22日,星期六
塞斯·波特 塞姆·乌特公司 15年6月4日 01:06 2015年3月1日,星期日
奥列格·麦克弗森 努克·艾克·塞姆有限责任合伙企业 14年8月3日 03:08 2014年9月21日,星期日
肯南·斯奈德 阿梅特·孔塞克特图尔联合会 14年1月23日 06:01 2014年4月7日,星期一
埃默里·多诺万 达皮布斯公司 14年6月14日 08:06 2014年9月30日,星期二
奈达·亨特 奥古埃·塞勒里斯克·莫里斯公司 13年12月23日 11:12 2015年7月19日,星期日
克林顿·莫里森 非拉西尼亚工业 14年3月18日 02:03 2015年3月6日,星期五
海伦·古铁雷斯 福西布斯公司 15年8月7日 07:08 2014年2月4日,星期二
坎迪斯·邦纳 多内克有限责任合伙企业 13年12月28日 05:12 2015年3月16日,星期一
尼西姆·卡特 苏斯彭迪塞·塞德有限公司 14年3月19日 01:03 2015年6月29日,星期一
卡西米尔·霍夫曼 艾德·利伯罗·多内克咨询 14年12月23日 05:12 2015年9月23日,星期三
伊莫金·麦康奈尔 维塔联合会 15年2月17日 07:02 2014年7月22日,星期二
圣人莫斯利 梅图斯·因公司 15年5月24日 05:05 2014年4月21日,星期一
西比尔·帕克特 维尔·莱克图斯有限责任合伙企业 14年6月9日 09:06 2014年9月6日,星期六
凯琳·索利斯 艾克有限公司 15年1月20日 10:01 2015年9月15日,星期二
贝娅特丽斯·赫尔利 毛里斯·艾·努克公司 14年5月11日 04:05 2015年4月26日,星期日
特洛伊·马奎兹 达皮布斯·夸姆研究所 15年2月7日 12:02 2015年4月23日,星期四
马尔科姆·佩恩 阿迪皮辛·利古拉研究所 15年8月17日 04:08 2014年9月2日,星期二
韦德·巴伦苏埃拉 萨吉蒂斯·杜伊斯·格拉维达公司 14年5月22日 03:05 2014年1月13日,星期一
凯瑟琳·吉尔摩尔 乌尔纳·内克有限公司 14年3月5日 05:03 2015年11月16日,星期一
梅特·斯科特 伊普苏姆·库苏斯公司 14年5月28日 01:05 2014年6月8日,星期日
卡马尔·纳什 塞姆·维塔公司 14年10月7日 05:10 2014年6月26日,星期四
伊利亚纳·韦斯特 艾克·埃利芬德有限公司 15年10月24日 01:10 2014年7月2日,星期三
苏珊·奥斯本 索利西图丁·阿迪皮辛·利古拉研究所 14年2月18日 03:02 2015年6月13日,星期六
阿迪娜·卡特 尼布工业 15年1月27日 04:01 2015年2月3日,星期二
邓肯·麦金尼 维尔·康瓦利斯·因公司 15年11月23日 09:11 2015年12月12日,星期六
阿里安娜·怀特海德 发酵梅图斯联合会 14年6月9日 03:06 2015年12月15日,星期二
菲奥娜·亨德森 埃格特·廷西登特·杜伊公司 14年1月1日 03:01 2015年1月9日,星期五
犹大·盖茨 多内克·费利斯联合会 15年11月30日 04:11 2015年9月28日,星期一
哈萨德·麦卡锡 艾克·特鲁斯公司 14年1月21日 12:01 2014年1月27日,星期一
谢伊·瓦伦西亚 纳托克联合会 14年3月4日 05:03 2014年12月15日,星期一
希拉里·陈 整数莫里斯基金会 14年12月31日 08:12 2015年8月26日,星期三
玛格丽特·塞勒斯 拉库斯·奎斯克公司 15年10月17日 11:10 2015年7月5日,星期日
普雷斯科特·莫顿 前庭联合会 15年4月27日 01:04 2015年6月14日,星期日
慈善吉尔伯特 托特·艾特·里苏斯联合会 14年7月31日 01:07 2014年12月18日,星期四
弗雷娅·兰多夫 乌特研究所

2015年11月3日 07:11 2014年9月27日 星期六
妮塔·豪 奥纳雷·富斯公司 2014年2月12日 11:02 2015年6月9日 星期二
柯比·惠特尼 福西布斯·莫比·维希库拉基金会 2013年12月22日 11:12 2015年8月26日,星期三
艾莫斯·贾维斯 毛里斯·苏斯彭迪斯·阿利夸特有限责任合伙企业 2015年5月10日 01:05 2014年7月14日 星期一
金·亨特 利古拉·多内克·卢克图斯公司 2015年11月25日 07:11 2014年10月23日 星期四
罗莎琳·本顿 伊阿库利斯·奎斯·佩德公司 2014年9月16日 02:09 2015年11月15日 星期日
安若莉·弗洛伊德 农克公司 2014年3月28日 12:03 2014年12月1日 星期一
贝西尔·哈蒙 森珀·鲁特鲁姆·富斯专业公司 2015年12月9日 05:12 2014年9月17日 星期三
科米特·埃雷拉 塞德·托托尔·英特格尔有限公司 2014年9月26日 03:09 2015年6月14日,星期日
温弗里德·皮尔森 奥格工业 2015年9月18日 10:09 2015年8月4日 星期二
莱斯特·费舍尔 艾尼安专业公司 2015年9月15日 02:09 2015年7月29日 星期三
塔图姆·多蒂 农克·努拉有限责任合伙企业 2015年6月25日 09:06 2014年2月19日 星期三
扎卡里·怀尔德 内克有限责任公司 2014年9月19日 03:09 2015年4月8日 星期三
莱斯·彼得斯 伊普苏姆·利奥·埃勒门特姆研究所 2014年6月17日 11:06 2014年11月13日 星期四
伊芙琳·拉莫斯 农克工业 2014年6月3日 01:06 2014年4月10日 星期四
玛拉·迈克尔 乌特·阿里夸姆有限责任公司 2014年7月14日 10:07 2015年11月26日 星期四
杰米玛·鲍尔斯 欧·阿尔库·莫比有限责任合伙企业 2014年8月4日 06:08 2015年5月1日 星期五
塔内克·古德里 西特联合公司 2015年2月19日 09:02 2015年5月28日 星期四
哈丽特·克雷恩 奎斯·阿库姆桑有限公司 2014年8月2日 12:08 2015年12月13日 星期日
金·邦德 奥克托尔·奎斯公司 2015年8月25日 09:08 2014年11月18日 星期二
乌尔萨·雅各布斯 康瓦利斯·安特专业公司 2014年4月5日 08:04 2014年2月18日 星期二
杰森·科利尔 维尔·佩德·布兰迪特有限公司 2014年5月12日 01:05 2015年9月21日 星期一
奎姆比·斯通 拉库斯·奎斯克股份有限公司 2015年8月10日 09:08 2015年7月2日 星期四
梅尔文·斯威特 内克基金会 2015年1月17日 05:01 2014年5月22日 星期四
索尔·威尔逊 阿尔库·维瓦姆斯·西特工业 2015年2月17日 02:02 2014年8月7日 星期四
伯顿·马奎兹 奥格公司 2015年12月2日 09:12 2014年11月26日 星期三
凯·韦尔 法西利斯·维塔有限公司 2014年6月23日 12:06 2014年6月29日 星期日
霍姆斯·墨菲 杜伊·内克·腾普斯公司 2015年10月25日 12:10 2015年4月26日,星期日
布莱恩·瓦伦丁 普罗因研究所 2014年10月16日 04:10 2015年3月30日 星期一
莱昂内尔·帕切科 多洛尔公司 2014年3月18日 07:03 2014年5月24日,星期六
基夫·弗莱彻 艾米·弗林吉拉工业 2015年9月25日 03:09 2015年10月22日 星期四
斯莱德·罗哈斯 索达莱斯·尼西·马格纳专业公司 2015年9月1日 08:09 2014年6月11日 星期三
凡娜·柯克兰 腾普斯公司 2015年2月14日 03:02 2015年12月9日 星期三
卡梅伦·彼得斯 洛博蒂斯·特鲁斯·胡斯托有限公司 2015年2月9日 06:02 2015年1月2日 星期五
里德·弗里曼 奥格·塞德·莫莱斯特有限责任合伙企业 2015年9月24日 01:09 2015年7月19日,星期日
弗洛伦斯·伯吉斯 阿里夸姆·奥克托尔·维利特股份有限公司 2014年4月20日 05:04 2014年9月8日 星期一

工作原理

实际的插件代码非常简单 - 只有 15 行。所有真正的“魔法”都由 Moment.js 为我们完成。但是,我们需要知道如何为 DataTables 创建插件以将其连接起来。

自动类型检测插件

DataTables 的类型检测方法附加到 $.fn.dataTable.ext.type.detect 数组。这是一个函数数组,DataTables 将循环遍历该数组,检查列中的数据是否与任何给定的类型匹配。

因此,在这种情况下,我们可以简单地使用 moment().isValid() 方法来检查传递给函数的数据是否有效。结果是

$.fn.dataTable.ext.type.detect.unshift( function ( d ) {
    return moment( d, format, locale, true ).isValid() ?
        'moment-'+format :
        null;
} );

请注意,unshift 用于将类型检测函数添加到数组的开头,以确保 DataTables 在任何其他类型检测之前使用此类型检测。

排序插件

与类型检测插件类似,排序插件附加到 $.fn.dataTable.ext.type.order 对象,使用排序方法将应用到的类型的名称。DataTables 具有内置的数字和字符串值的排序比较,因此我们只需创建一个插件即可返回日期/时间的格式化数字表示形式,为此我们可以使用 moment().unix()

$.fn.dataTable.ext.type.order[ 'moment-'+format+'-pre' ] = function ( d ) {
    return moment( d, format, locale, true ).unix();
};

完整插件

将所有内容放在一起,我们就有了 DataTables 的结果插件 - 终极日期/时间排序插件,这要归功于 Moment.js!

$.fn.dataTable.moment = function ( format, locale ) {
    var types = $.fn.dataTable.ext.type;

    // Add type detection
    types.detect.unshift( function ( d ) {
        return moment( d, format, locale, true ).isValid() ?
            'moment-'+format :
            null;
    } );

    // Add sorting method - use an integer for the sorting
    types.order[ 'moment-'+format+'-pre' ] = function ( d ) {
        return moment( d, format, locale, true ).unix();
    };
};