用Javascript按日期对一个数组中的数组进行排序

4
我有一个二维数组,其中第一个字段是字符串格式的日期。我希望按照日期(升序)对它们进行排序,以便进行进一步的计算。 我的问题可以分为两个任务。首先,将字符串解析为日期,然后进行排序。
a = new Date(Date.parse('1/11/2014 13:42:54'));
console.log(a)

返回1月11日,而我需要11月1日

然后,排序应该按照以下方式进行:

function compare(a,b) {
  if (a[0] < b[0])
     return -1;
  if (a[0] > b[0])
    return 1;
  return 0;
}

myarray.sort(compare);

那么,我如何解决日期问题以使其在排序功能中正常工作呢?
4个回答

3

如果你的日期是以ISO格式存储,你可以使用以下代码:

myarray.sort(function (a, b) {
    return (new Date(a[0])).getTime() - (new Date(b[0])).getTime();
});

这能解决日期问题(获取日期而非月份或反之亦然)吗? - Tasos
getTime() 返回自纪元以来的绝对毫秒数,因此非常适合按时间顺序排序。 - Dylan Watt
@Anastasios Ventouris 不行。你必须确保你的日期格式符合这里指定的任一格式。 - hindmost

1

只需捕获日期和月份部分,交换它们并执行 Date.parsenew Date,就像这样。

function getFormattedDate(dateString) {
    var result = dateString.replace(/(\d+)\/(\d+)(.*)/, function (m, g1, g2, g3) {
        return g2 + "/" + g1 + g3;
    });

    return new Date(Date.parse(result));
}

console.log(getFormattedDate('1/11/2014 13:42:54'));
// Sat Nov 01 2014 13:42:54 GMT+0000 (GMT)

在这里,正则表达式(\d+)\/(\d+)(.*)将捕获字符串的三个部分,首先(\d+)捕获日期部分,接着是/(转义为\/),然后用另一个(\d+)捕获月份部分,最后将字符串的其余部分捕获到(.*)中。然后,我们通过交换g2g1(月份和日期部分)的位置来返回一个新字符串。 注意:如果你只是想排序,那么你不需要创建一个新的Date对象。你可以简单地使用Date.parse的结果,它是纪元时间,像这样:
function getEpochTime(dateString) {
    var result = dateString.replace(/(\d+)\/(\d+)(.*)/, function (m, g1, g2, g3) {
        return g2 + "/" + g1 + g3;
    });

    return Date.parse(result);
}

function comparator(firstDate, secondDate) {
    return getEpochTime(firstDate) - getEpochTime(secondDate);
}

然后像这样排序

var arr = ['3/11/2014 13:42:54',
    '2/11/2014 13:42:54',
    '1/12/2014 13:42:54',
    '1/11/2014 13:43:54'
];

arr.sort(comparator);

console.log(arr);

会给你。
[ '1/11/2014 13:43:54',
  '2/11/2014 13:42:54',
  '3/11/2014 13:42:54',
  '1/12/2014 13:42:54' ]

1
使用moment.js,您可以使用字符串+格式构造函数创建一个时刻对象。
moment('1/11/2014 13:42:54', 'DD/MM/YYYY HH:mm:ss')

如果您有一个数组的数组,其中第一个字段是日期(以字符串格式):

array_of_arrays = [
  ['1/11/2014 13:42:54', 'val'],
  ['2/11/2014 13:42:54', true]
];

for(array in array_of_arrays){
     epoch = moment(array.shift,'DD/MM/YYYY HH:mm:ss').unix();
     array.unshift(epoch);
 }

现在,您只需要执行new Date(epoch),而不是复杂的日期对象,我们有Unix Epoch,可以轻松地使用内置的Array.sort进行排序,就像这样。
function Comparator(a,b){
 if (a[0] < b[0]) return -1;
 if (a[0] > b[0]) return 1;
 return 0;
}
array_of_arrays.sort(Comparator);

现在您已经按日期对array_of_arrays进行了排序。

最后,如果您需要比这更精确的答案,请分享一些更多的示例代码。


0

这是问题:

a = new Date(Date.parse('1/11/2014 13:42:54'));
console.log(a)

返回1月11日,我需要11月1日。
您的日期格式为dd/mm/yyy;Date.parse('1/11/2014 13:42:54')接受mm/dd/yyyy。
尝试以下日期解析:
function parseDate(str) {
    var ds = str.match(/(\d+)\/(\d+)\/(\d+)\s+(\d+):(\d+):(\d+)/);
    // Convert to format: mm/dd/yyyy
    return new Date(ds[3], ds[2] - 1, // month is 0-based
                ds[1], ds[4], ds[5], ds[6]);
}

var arr = [parseDate('3/11/2014 13:42:54'),
  parseDate('2/11/2014 13:42:54'),
  parseDate('1/12/2014 13:42:54'),
  parseDate('1/11/2014 13:43:54')
];

arr.sort();

或者:

function parseDate(str) {
    var ds = str.match(/(\d+)\/(\d+)\/(\d+)\s+(\d+):(\d+):(\d+)/);
    // Convert to format: mm/dd/yyyy
    return new Date(ds[3], ds[2] - 1, // month is 0-based
                ds[1], ds[4], ds[5], ds[6]);
}

var arr = ['3/11/2014 13:42:54',
  '2/11/2014 13:42:54',
  '1/12/2014 13:42:54',
  '1/11/2014 13:43:54'
];


arr.sort(function(a, b) {
    return parseDate(a) - parseDate(b);
})

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