2012-08-30 177 views
2

如何按日期排序(ISO 8601)这个数组?Jquery - 按ISO 8601排序数组日期

var myArray = new Array(); 

myArray[0] = { name:'oldest', date:'2007-01-17T08:00:00Z' } 
myArray[1] = { name:'newest', date:'2011-01-28T08:00:00Z' } 
myArray[2] = { name:'old', date:'2009-11-25T08:00:00Z' } 

游乐场:
http://jsfiddle.net/4tUZt/

在此先感谢!

+0

在我看来,日期将按照字母顺序排序太 – mplungjan

+0

很多人都建议'Date.parse'但它没有给出一致的结果HTTP ://stackoverflow.com/questions/5802461/javascript-which-browsers-support-parsing-of-iso-8601-date-string-with-date-par – Scott

回答

8

排序,按字典顺序:

由于@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

+0

@nbrooks谢谢 – Scott

+0

我发现,返回这在底部 'Date.prototype.setISO8601 = function(string){ ... return this; }' 有必要使这项工作... – Ian

+1

这可能是完整的,但它是没有必要的。 ** ISO8601是[设计](https://en.wikipedia.org/wiki/ISO_8601#General_principles)的辞典排序,所以只是''2007-01-17T08:00:00Z'<'2008-01-17T08: 00:00Z'=== true' ** – kdbanman

2

http://jsfiddle.net/4tUZt/2/

$(document).ready(function() 
{ 
    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' }]; 

    console.log(myArray.sort(sortByDate));   
}); 

// Stable, ascending sort (use < for descending) 
function sortByDate(obj1, obj2) { 
    return new Date(obj2.date) > new Date(obj1.date) ? 1 : -1; 
} 

+0

旧版本的WebKit和Internet Explorer本身不支持ISO 8601。所以这可能会在旧版浏览器中失败。 – Scott

+2

如何排序字符串? – mplungjan

+0

@scott非常感谢,我不确定IE的哪个版本实际上支持它,我会仔细检查。 – nbrooks

1

演示:http://jsfiddle.net/4tUZt/4/

var myArray = new Array(); 

myArray[0] = { name:'oldest', date: '2007-01-17T08:00:00Z' }; 
myArray[1] = { name:'newest', date: '2011-01-28T08:00:00Z' }; 
myArray[2] = { name:'old', date: '2009-11-25T08:00:00Z' }; 

var sortFunction = function (a, b) { 
    return Date.parse(b.date) - Date.parse(a.date); 
}; 

/* or 

var sortFunction = function (a, b) { 
    return new Date(b.date) - new Date(a.date); 
}; 

*/ 

console.log(myArray.sort(sortFunction)); 

+0

较旧版本的WebKit和Internet Explorer本身不支持ISO 8601。所以这可能会在旧版浏览器中失败。 – Scott

3

我会去这个:

console.clear(); 

var myArray = new Array(); 

myArray[0] = { name:'oldest', date:'2007-01-17T08:00:00Z' } 
myArray[1] = { name:'newest', date:'2011-01-28T08:00:00Z' } 
myArray[2] = { name:'old', date:'2009-11-25T08:00:00Z' } 

console.dir(myArray); 

var newArray = myArray.sort(function(a,b){ 
    if (a.date < b.date) return -1; 
    else if (a.date > b.date) return 1; 
    else return 0; 
}); 

console.dir(newArray); 
+0

旧版本的WebKit和Internet Explorer本身不支持ISO 8601。所以这可能会在旧版浏览器中失败。 – Scott

+2

其实在这种情况下,他只是按字母顺序排序,这看起来应该工作+1 – nbrooks

+0

@Scott我只是排序字符串而不是日期。这工作,我一直在使用这一段时间。 – tborychowski

1

ISO8601的目的是正确地排序为纯文本,所以在一般情况下,正常排序会做。

要按数组中对象的特定键排序,您需要指定sort()方法的比较函数。在许多其他语言中,使用cmp函数很容易编写,但JS没有内置函数,因此我觉得编写自己的函数最简单。

var myArray = new Array(); 

myArray[0] = { name:'oldest', date:'2007-01-17T08:00:00Z' } 
myArray[1] = { name:'newest', date:'2011-01-28T08:00:00Z' } 
myArray[2] = { name:'old', date:'2009-11-25T08:00:00Z' } 

// cmp helper function - built in to many other languages 
var cmp = function (a, b) { 
    return (a > b) ? 1 : ((a > b) ? -1 : 0); 
} 

myArray.sort(function (a,b) { return cmp(a.date, b.date) }); 

P.我会写使用JSON的语法我的阵列,像这样:

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' } 
];