排序字符串日期数组

时间:2016-06-02 09:39:54

标签: javascript jquery

我在javascript中有一个看起来像这样的数组

Array[9]
0: "01/06/2016"
1: "02/06/2016"
2: "23/05/2016"
3: "24/05/2016"
4: "25/05/2016"
5: "26/05/2016"
6: "27/05/2016"
7: "28/05/2016"
8: "31/05/2016"
length: 9__proto__: Array[0]

我想订购它们,所以最早的日期是第一个,最近的日期是最后的。 我试过了

days.sort(function(a,b) {
    return new Date(a).getTime() - new Date(b).getTime()
});

但我猜是因为日期的格式?这不起作用。 我还能尝试什么?

预期产出

Array[9]
0: "23/05/2016"
1: "24/05/2016"
2: "25/05/2016"
3: "26/05/2016"
4: "27/05/2016"
5: "28/05/2016"
6: "31/05/2016"
7: "01/06/2016"
8: "02/06/2016"
length: 9__proto__: Array[0]

5 个答案:

答案 0 :(得分:4)

您可以将字符串切换为年,月,日,并使用该字符串创建比较日期。

new Date("01/06/2016") 不会按您的想法进行解析。结果实际上是 Jan 06 2016



days = ["01/06/2016", "02/06/2016", "23/05/2016", "24/05/2016", "25/05/2016", "26/05/2016", "27/05/2016", "28/05/2016", "31/05/2016"];
days.sort(function(a, b) {
  aArr = a.split('/');
  bArr = b.split('/');
  return new Date(aArr[2], Number(aArr[1])-1, aArr[0]).getTime() - new Date(bArr[2], Number(bArr[1])-1, bArr[0]).getTime()
});
console.log(days);




答案 1 :(得分:2)

这是因为在你的情况下Date使用的格式是MM / DD / YYYY

new Date("01/06/2016");
> Wed Jan 06 2016 00:00:00 GMT+0100 (Mitteleuropäische Zeit) 

另见http://www.w3schools.com/js/js_date_formats.asp

但是从您的列表中我假设您的日期是DD / MM / YYYY格式。

3种可能的解决方案:

  • 在列表中使用其他格式

  • 您可以拆分字符串并在排序功能中通过new Date(year, month, day);创建日期。

  • 使用高级日期/时间库,我推荐moment.js http://momentjs.com/

答案 2 :(得分:0)

var array= [ "01/06/2016" ,
 "02/06/2016" ,
 "23/05/2016" ,
 "24/05/2016" ,
 "25/05/2016" ,
 "26/05/2016" ,
 "27/05/2016" ,
 "28/05/2016" ,
 "31/05/2016" ];
 array.sort(function (a, b) {
 var dateParts1 = a.split("/");
 var dateParts2 = b.split("/");
 var dateA=dateParts1[2]*360+ dateParts1[1]*30+ dateParts1[0];
 var dateB=dateParts2[2]*360+ dateParts2[1]*30+ dateParts2[0];
  if (dateA > dateB) {
    return 1;
  }
  if (dateA < dateB) {
    return -1;
  }
  return 0;
});

答案 3 :(得分:0)

请分离解析和排序操作并缓存中间值。

days = ["01/06/2016", "02/06/2016", "23/05/2016", "24/05/2016", "25/05/2016", "26/05/2016", "27/05/2016", "28/05/2016", "31/05/2016"];


days.map(v => {  //parsing
  var a = v.split("/");
  return {
    value: v,
    ts: +new Date(+a[2], a[1]-1, +a[0])
  }
})
.sort((a,b) => a.ts - b.ts)  //sorting
.map(o => o.value);  //returning the associated (input-)values

对于输入数组中的n项,排序函数最多可调用n * (n-1)次,具体取决于实现的排序算法。
在这种情况下,在最坏的情况下解析这样的字符串最多144次。

在最好的情况下(数组已经排序),这里的其他实现必须为这9个项目解析至少16次。 (8个比较* 2个要解析的字符串)

这可能听起来不太多(但),但这些数字呈指数增长。

答案 4 :(得分:0)

请试试这个:

&#13;
&#13;
var array = ["01/06/2016", "02/06/2016", "23/05/2016", "24/05/2016", "25/05/2016", "26/05/2016", "27/05/2016", "28/05/2016", "31/05/2016"];
    function dateString2Date(dateString) {
      var dt  = dateString.split(/\//);
      return new Date(dt[2]+"-"+dt[1]+"-"+dt[0]);
    }
    for(var i =0 ; i<=array.length-2;i++){
        for(var j=i+1; j<=array.length-1;j++){
            if(dateString2Date((array[i])).getTime()/1000> dateString2Date((array[j])).getTime()/1000){
                var temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
    }

console.log(array)
&#13;
&#13;
&#13;