我正在尝试使用sort()
函数对包含字符串格式的日期(dd-mmm-yy)的数组进行排序:
var array = ["1-jun-15", "1-feb-15", "1-apr-15", "1-may-15", "1-jan-15", "1-mar-15"];
array.sort(function(a, b) {
return new Date(a).getTime() - new Date(b).getTime();
});
但没有成功。
这里出了什么问题? Here is the JSFiddle
编辑:虽然排序问题是通过小修正解决的,但主要问题是跨浏览器支持,下面的许多答案都有不同的解决方法。
答案 0 :(得分:4)
您可以拆分日期字符串并使用月份值的对象。
此提案先按年份排序,然后按月份按对象排序,然后按天排序。
var array = ["1-jun-15", "1-feb-15", "1-apr-15", "1-may-15", "1-jan-15", "1-mar-15"],
MONTHS = { jan: 1, feb: 2, mar: 3, apr: 4, may: 5, jun: 6, jul: 7, aug: 8, sep: 9, oct: 10, nov: 11, dec: 12 };
array.sort(function (a, b) {
var aa = a.split('-'),
bb = b.split('-');
return aa[2] - bb[2] || MONTHS[aa[1]] - MONTHS[bb[1]] || aa[0] - bb[0];
});
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:2)
那些不是有效日期,并且字符串没有date
属性,因此每次排序只比较NaN
而不是日期
某些浏览器可能能够解析1-jun-15
,但 不 符合IETF标准的日期,并且无法保证javascript引擎会知道什么与该格式的日期有关。
事实上,在IE和Firefox中进行的一些小测试表明他们无法一起解析这种格式,而Chrome没有任何问题,这就是为什么应该始终将符合标准的日期或多个参数传递给{ {1}}。
您必须自己解析日期
new Date
答案 2 :(得分:2)
您尝试从比较器中的date
和a
获取b
属性,但它只是一个字符串。因此,您需要解析它(Date.parse(a)
或new Date(a)
)。
此处已修复jsfiddle。
答案 3 :(得分:1)
您需要三个步骤:
工作示例:
var dateArray = ["1-jun-15", "1-feb-15", "1-apr-15", "1-may-15", "1-jan-15", "1-mar-15"];
console.log(dateArray);
// STEP ONE - CONVERT THE ARRAY ITEMS
for (var i = 0; i < dateArray.length; i++) {
var tempDateArray = dateArray[i].split('-');
// Convert the year into a 4-digit number
var year = '20' + tempDateArray[2];
// Convert the month into a 2-digit number
var month = tempDateArray[1];
switch(month) {
case ('jan') : month = '01'; break;
case ('feb') : month = '02'; break;
case ('mar') : month = '03'; break;
case ('apr') : month = '04'; break;
case ('may') : month = '05'; break;
case ('jun') : month = '06'; break;
case ('jul') : month = '07'; break;
case ('aug') : month = '08'; break;
case ('sep') : month = '09'; break;
case ('oct') : month = '10'; break;
case ('nov') : month = '11'; break;
case ('dec') : month = '12'; break;
}
// Convert the date into a 2-digit number
var date = tempDateArray[0];
if (date < 2) {
date = '0' + date;
}
// Recreate each array item as an 8-digit integer
dateArray[i] = year + month + date;
}
console.log(dateArray);
// STEP TWO - SORT THE ARRAY ITEMS
dateArray.sort(function(a, b){return a-b});
console.log(dateArray);
// STEP THREE - CONVERT THE ARRAY ITEMS BACK AGAIN
for (var i = 0; i < dateArray.length; i++) {
// Convert the date back again
var date = dateArray[i].substring(6);
if (date.substring(0,1) === '0') {
var date = date.substring(1);
}
// Convert the month back again
var month = dateArray[i].substring(4,6);
switch(month) {
case ('01') : month = 'jan'; break;
case ('02') : month = 'feb'; break;
case ('03') : month = 'mar'; break;
case ('04') : month = 'apr'; break;
case ('05') : month = 'may'; break;
case ('06') : month = 'jun'; break;
case ('07') : month = 'jul'; break;
case ('08') : month = 'aug'; break;
case ('09') : month = 'sep'; break;
case ('10') : month = 'oct'; break;
case ('11') : month = 'nov'; break;
case ('12') : month = 'dec'; break;
}
// Convert the year back again
var year = dateArray[i].substring(2,4);
dateArray[i] = date + '-' + month + '-' + year;
}
console.log(dateArray);
答案 4 :(得分:0)
一种简单的方法是将日期转换为Unix时间戳,对它们进行排序,然后转换回原始日期格式。那么你不必担心在几个月里进行字符串比较。
答案 5 :(得分:0)
您需要将日期字符串转换为有效日期,然后比较时间戳。
var array = ["1-jun-15", "1-feb-15", "1-apr-15", "1-may-15", "1-jan-15", "1-mar-15"];
const months = ['jan', 'feb', 'mar', 'apr', 'may', 'jun']
const strToDate = str => {
const params = str.split('-')
params[0] = parseInt(params[0])
params[1] = months.indexOf(params[1])
params[2] = parseInt(params[2]) + 2000
return new Date(...params.reverse())
}
array.sort(function(a, b) {
return strToDate(a).getTime() - strToDate(b).getTime();
});
console.log(array)
&#13;