对包含dd-mmm-yy格式的日期的数组进行排序

时间:2016-11-29 12:43:11

标签: javascript

我正在尝试使用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

编辑:虽然排序问题是通过小修正解决的,但主要问题是跨浏览器支持,下面的许多答案都有不同的解决方法。

6 个答案:

答案 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)

您尝试从比较器中的datea获取b属性,但它只是一个字符串。因此,您需要解析它(Date.parse(a)new Date(a))。

此处已修复jsfiddle

答案 3 :(得分:1)

您需要三个步骤:

  1. 转换日期
  2. 排序日期
  3. 再次转换日期
  4. 工作示例:

    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)

您需要将日期字符串转换为有效日期,然后比较时间戳。

&#13;
&#13;
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;
&#13;
&#13;