如何用JavaScript按dd/mm/yyyy格式对数组日期进行排序?

5

我该如何按照时间顺序排序日期数组?例如,我有以下日期:

var dates = [
    '03/03/2014',
    '01/03/2014',
    '02/03/2014',
    '04/03/2014'
];

sortDates = sortDate(dates);

sortDate(array){
    // ?
    returnt arraySort;
}

我希望得到的数组结果如下:

[
    '01/03/2014', 
    '02/03/2014',
    '03/03/2014', 
    '04/03/2014'
]
7个回答

15

假设你的日期格式始终为DD/MM/YYYY

dates.sort(function(a, b){
    var aa = a.split('/').reverse().join(),
        bb = b.split('/').reverse().join();
    return aa < bb ? -1 : (aa > bb ? 1 : 0);
});

...否则,如果你需要更灵活的操作,你将不得不比较Date对象。


1
这个程序运行良好。但是我的日期格式为MM/DD/YYYY,如果我创建两个具有相同日期的数据,则无法正常工作。请帮忙。 - user2136053
1
在这个帖子中已经有回答了,可以解决你的特定问题。特别是这一个 - 你只需要交换索引10之间的比较顺序即可。事实上,在任何情况下,这都是比我的更好的改进。 - Emissary

7
尝试这个(随时询问细节):
dates.sort(function (a, b) {
    // '01/03/2014'.split('/')
    // gives ["01", "03", "2014"]
    a = a.split('/');
    b = b.split('/');
    return a[2] - b[2] || a[1] - b[1] || a[0] - b[0];
});

最后一行的翻译:

return          return
a[2] - b[2]     years comparison if year A - year B is not 0
||              or
a[1] - b[1]     months comparison if month A - month B is not 0
||              or
a[0] - b[0];    days comparison

请查看以下链接:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/sort


2
仅仅改进了@leaf的答案,因为split方法只能用于字符串类型,所以如果'a'和'b'的类型是对象,则可能会出错。
dates.sort(function (a, b) {
        a = a.toString().split('/');
        b = b.toString().split('/');
        return a[2] - b[2] || a[1] - b[1] || a[0] - b[0];
    });

1
请用简单的方式完成这个任务。
适用于格式为“dd/mm/yy”或“dd/mm/yyyy”的日期。
var dates = [
    '03/03/2014',
    '01/03/2014',
    '02/03/2014',
    '04/03/2014'
];

dates.sort( function(c,d){
    var rx = /(\d+)\/(\d+)\/(\d+)/;
    var a = Number(c.replace(rx, '$3$1$20000'));
    var b = Number(d.replace(rx, '$3$1$20000'));
    return a > b ? -1 : a == b ? 0 : 1; // for newer on top
    //return a < b ? -1 : a == b ? 0 : 1; // for older on top
  });

0

Digigizmo的答案可行!

如果是:dd/mm/yyyy hh:mm:ss 你可以使用:

list.sort(function (a, b) {
    var aa = a.substring(0, 10).split('/').reverse().join() + replaceAll(':', '', a.substring(11, 20)),
    bb = b.substring(0, 10).split('/').reverse().join() + replaceAll(':', '', b.substring(11, 20));
    return aa < bb ? -1 : (aa > bb ? 1 : 0);
});

和replaceAll函数:

function replaceAll(find, replace, str) {
  return str.replace(new RegExp(find, 'g'), replace);
}

0
dates.sort((a, b) => new Date(a).getTime() - new Date(b).getTime())

如果你不想就地对数组元素进行排序,可以尝试这段代码

dates.slice().sort((a, b) => new Date(a).getTime() - new Date(b).getTime())

0
let arrayDate = ["11/12/2022", "10/11/2021", "20/01/2001", "30/10/2022"];function formatFrToEn(arg){
let [day, month, year] = arg.split("/");
let newFormatDate = [month, day, year].join("/");
return newFormatDate;}let newArrayDate = arrayDate.map( x => new Date( formatFrToEn(x) ) )console.log(newArrayDate)newArrayDate = newArrayDate.sort( (a, b) => Number(a) - Number(b) )function padTo2Digits(num) {
return num.toString().padStart(2, '0');}function formatDate(date){return[padTo2Digits(date.getDate()),padTo2Digits(date.getMonth() + 1), date.getFullYear(),.join('/');newArrayDate = newArrayDate.map(x=>formatDate(x))console.log(newArrayDate)

1
欢迎来到stackoverflow。请在您的回答中加入一些细节,避免只发送一段代码。 - MD Zand

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