Найти минимальные и максимальные даты

Есть массив:

var a = new Array();

Он содержит записи о дате, например: "2012-09-12 09:20" и т. Д.

Мне нужно найти минимальные и максимальные даты, используя JavaScript. Этот код не работает со значениями времени.

var minT = Math.min.apply(Math, a);
var maxT = Math.max.apply(Math, a);

Как я могу решить эту проблему в JavaScript? Это кажется довольно сложным, так как я не очень опытен в этом языке.

5 ответов

Решение

Если ваш массив содержит Date объекты, то это должно работать. Если он просто содержит строки, такие как '2012-09-12 09:20', затем вы можете отсортировать их, и получить 1-й и последний элементы.

a.sort(function(a, b){
    return Date.parse(a) - Date.parse(b);
});

var maxT = a[a.length-1];
var minT = a[0];

Math.min / maxсравнивает только цифры, а не строки. Не используйте их для представления дат, но используйте Date объекты - они будут сравниваться по их внутреннему номеру метки времени. Тем не менее, max/min вернет этот внутренний номер, поэтому вам нужно будет преобразовать его обратно в Date (см. Мин. / Макс. дат в массиве?):

Однако, если вы хотите использовать строки или не можете использовать воссозданную дату, вам нужно будет запустить ее вручную через массив - либо с помощью цикла for, либо с помощью итератора только для ES5.1. .reduce():

var min = datestrings.reduce(function(min, cur) {
    return cur < min ? cur : min;
});

// is equivalent to
var min = datestrings[0];
for (var i=1; i<datestrings.length; i++)
    if (datestrings[i] < min)
        min = datestrings[i];

Если ваш код не должен быть эффективным, вы также можете просто отсортировать массив и получить первое и последнее значения. Алфавитно-цифровая сортировка по умолчанию сделает это для вашего формата даты, так что это действительно просто:

datestrings.sort();
var min = datestrings[0],
    max = datestrings[datestrings.lengh-1];

Попробуй это:

var maxDate=new Date(Math.max.apply(null,dates));
var minDate=new Date(Math.min.apply(null,dates));

Я нашел это по более раннему вопросу

Это должно сделать это:

var maxT=new Date(Math.max.apply(null,a));
var minT=new Date(Math.min.apply(null,a));

Если вам нужно работать со строками, вы можете определить функцию:

function maxDate(data){
    var max = '';
    for(var i=0; i<data.length; i++)
        if(data[i]>max)
            max=data[i];
    return max;
}

А потом:

var maxT=maxDate(a);

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Этот второй метод будет работать только в том случае, если все строки даты имеют одинаковый формат, и если у вас разные даты формата в вашем массиве, вы не сможете использовать эту функцию.

Заполнен ли массив объектами Date? Если так, сравните их, используя их, и сортируйте их, используя один из многих известных алгоритмов.

Если нет, воссоздайте массив с объектами Date, по одному для каждого из них, и сделайте, как я сказал выше, упорядочив массив.

Другие вопросы по тегам