对字符串日期数组进行排序

3
我有一个 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个回答

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);


非常感谢,想一想并查看这个,应该真的很明显,也许我今天有点慢。谢谢。 - Josh Kirkpatrick
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - rrk

3

这是因为在您的情况下,日期格式使用的是 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。

有三种可能的解决方案:

  • 在您的列表中使用不同的格式

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

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


总是喜欢给提示而不是直接给出解决方案。 - Mahedi Sabuj

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"];
    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)


你刚刚重新发明了 Array.sort。恭喜。 - Jamiec

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;
});

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次。

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

这听起来可能不算什么,但是这些数字呈指数增长。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接