排序,按字典顺序:
由于@kdbanman指出,ISO8601见一般原则是专为辞书排序。因此,ISO8601字符串表示可以像任何其他字符串一样排序,并且这会给出预期的顺序。
'2007-01-17T08:00:00Z' < '2008-01-17T08:00:00Z' === true
所以,你会实现:
var myArray = [
{ name:'oldest', date:'2007-01-17T08:00:00Z' },
{ name:'newest', date:'2011-01-28T08:00:00Z' },
{ name:'old', date:'2009-11-25T08:00:00Z' }
];
myArray.sort(function(a, b) {
return (a.date < b.date) ? -1 : ((a.date > b.date) ? 1 : 0);
});
排序使用JavaScript日期:WebKit和Internet Explorer中的
旧版本不支持ISO 8601周的日期,所以你必须做一个兼容的日期。它是由Firefox和WebKit的现代虽然在这里看到有关Date.parse支持的详细信息支持JavaScript: Which browsers support parsing of ISO-8601 Date String with Date.parse
以下是创建一个Javascript ISO 8601兼容的日期,一个很好的文章,你可以再有点像常规的JavaScript日期。
http://webcloud.se/log/JavaScript-and-ISO-8601/
Date.prototype.setISO8601 = function (string) {
var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
"(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
"(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
var d = string.match(new RegExp(regexp));
var offset = 0;
var date = new Date(d[1], 0, 1);
if (d[3]) { date.setMonth(d[3] - 1); }
if (d[5]) { date.setDate(d[5]); }
if (d[7]) { date.setHours(d[7]); }
if (d[8]) { date.setMinutes(d[8]); }
if (d[10]) { date.setSeconds(d[10]); }
if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
if (d[14]) {
offset = (Number(d[16]) * 60) + Number(d[17]);
offset *= ((d[15] == '-') ? 1 : -1);
}
offset -= date.getTimezoneOffset();
time = (Number(date) + (offset * 60 * 1000));
this.setTime(Number(time));
}
用法:
console.log(myArray.sort(sortByDate));
function sortByDate(obj1, obj2) {
var date1 = (new Date()).setISO8601(obj1.date);
var date2 = (new Date()).setISO8601(obj2.date);
return date2 > date1 ? 1 : -1;
}
更新的使用,包括排序技术信用@nbrooks
在我看来,日期将按照字母顺序排序太 – mplungjan
很多人都建议'Date.parse'但它没有给出一致的结果HTTP ://stackoverflow.com/questions/5802461/javascript-which-browsers-support-parsing-of-iso-8601-date-string-with-date-par – Scott