终极日期/时间排序插件
日期和时间可以用几乎无限的方式表示,使用不同的格式向最终用户显示数据点。例如,在空间不受限制的情况下,可以使用“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()
的不足,例如 Sugar、Datejs 和 date.format,但在此示例中,我们将使用 Moment.js,它提供了广泛的格式化选项(如果您愿意,也可以使用此帖子中介绍的技术使用任何其他库!)。
操作
使用此 DataTables“终极”日期/时间排序插件非常简单,只需将其(以及 Moment.js)包含在您的页面中即可 - 您可以使用 DataTables CDN 执行此操作(或将其连接到您的其他 Javascript 文件中,以 提高加载性能!)。
然后,使用 $.fn.dataTable.moment( format, locale )
方法注册您希望 DataTables 检测和排序的日期/时间格式,该方法最多接受两个参数。
format
- 要检测和排序的日期/时间格式 - 可用的选项在 Moment.js 文档 中定义。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();
};
};