Bir dizideki Min / Maks tarihler?


107

Bir tarih dizisinden minimum ve maksimum tarihi nasıl bulabilirim? Şu anda bunun gibi bir dizi oluşturuyorum:

var dates = [];
dates.push(new Date("2011/06/25"))
dates.push(new Date("2011/06/26"))
dates.push(new Date("2011/06/27"))
dates.push(new Date("2011/06/28"))

Bunu yapmak için yerleşik bir işlev var mı yoksa kendim mi yazmalıyım?

Yanıtlar:


137

Kod IE, FF, Chrome ile test edildi ve düzgün çalışıyor:

var dates=[];
dates.push(new Date("2011/06/25"))
dates.push(new Date("2011/06/26"))
dates.push(new Date("2011/06/27"))
dates.push(new Date("2011/06/28"))
var maxDate=new Date(Math.max.apply(null,dates));
var minDate=new Date(Math.min.apply(null,dates));

1
Numara dönüştürmesi '2011/06/25' dizesi için değil, yeni Tarih ('2011/06/25') için uygulandı. Numara (yeni Tarih ('2011/06/25')) === 1308949200000. Kod Chrome, IE, FF'de test edildi
Andrew D.

@RobG - "Dize tarihleri" ile neyi kastediyorsunuz?
Andrew D.

ör dates.push('2011/06/05'). Dizeler kullanılarak dizi basitçe sıralanabilir ve gerekirse ilk ve son üye değerleri döndürülerek tarihlere dönüştürülebilir.
RobG

10
@RobG - yukarıdaki soruda dizi "tarih dizeleri" değil, Tarih nesneleri içerir - ayrıca Tarih nesneleri için yanıt. Bazı durumlarda "tarih dizelerini" kullanmak çok kötü bir uygulamadır. Sonraki iki tarih dizesini karşılaştırın: "2011/06/05" ve "2011/06/05 00:00:00". 1) dizeler olarak: ("2011/06/05" === "2011/06/05 00:00:00"): sonuç yanlış; 2) Tarih nesneleri olarak (sayıya dönüştürülen): Sayı (yeni Tarih ("2011/06/05")) === Sayı (yeni Tarih ("2011/06/05 00:00:00")): sonuç doğrudur - doğru bir sonuçtur!
Andrew D.

@AndrewD. Diyelim ki dateStrings tutarlıysa YYYY/MM/DD HH:MM:SSve çok sayıda dize varsa, dize karşılaştırmasını veya Number(new Date(dateString))karşılaştırmalarını önerir misiniz ?
BlackPanther

85

Gibi bir şey:

var min = dates.reduce(function (a, b) { return a < b ? a : b; }); 
var max = dates.reduce(function (a, b) { return a > b ? a : b; });

Chrome 15.0.854.0 dev üzerinde test edildi


Array.reduce()IE9'dan önce IE'de mevcut değildir. Yine de harika bir fikir.
jfriend00

1
Array.reduce () javascript eşdeğeri işlevi ile uygulanabilir
Andrew D.

Kesinlikle, Eloquent Javascript'te okuyun :function foreach(func, array) { for(var i = 0; i != array.length; ++i) { func(array[i]); } } function reduce(combine, base, array) { foreach(function(element) { base = combine(base, element); }, array); return base; }
blaze

1
IE <9 ölebilir ve aslında, Nisan 2013 itibariyle şu anda küresel tarayıcı kullanımının yalnızca%
9,3'ünü oluşturuyor

3
Azaltma çözümü string ve Dates nesneleri için çalışır.
Benoit

33

_.minve _.maxtarih dizileri üzerinde çalışın; Lodash veya Underscore kullanıyorsanız bunları kullanın ve halihazırda kullanmadıysanız Lodash'ı (bunlar gibi birçok yardımcı program işlevi sağlar) kullanmayı düşünün.

Örneğin,

_.min([
    new Date('2015-05-08T00:07:19Z'),
    new Date('2015-04-08T00:07:19Z'),
    new Date('2015-06-08T00:07:19Z')
])

dizideki ikinci tarihi döndürür (çünkü bu en erken olanıdır).


3
OP'nin sorusuna doğrudan cevap vermiyor. OP, JavaScript'te yerleşik bir yöntemin bulunup bulunmadığını soruyor. Bu nedenle _.min & _.max minimum veya maksimum tarihleri ​​bulmak için kullanılabilir, ancak OP'nin aradığı şey bu değildir. Ayrıca, bir yardımcı program kitaplığının değerlendirilmesi, fikir bir konudur.
detj

13
Saygılarımla katılmıyorum ve bunun yararlı bir cevap olduğunu düşünüyorum, @detj - şu anda ifade edildiği şekliyle OP'nin sorusu ya yerleşik bir işlev olduğunu ya da kendi işlevini yazması gerektiğini varsayıyor, ancak bu doğru değil. OP'nin önerdiği çözümlerden herhangi birine alternatif olarak yardımcı program kitaplıklarına işaret etmek bana mantıklı geliyor. Ama mantığınız savunulabilir ve oyunuz size aittir.
Mark Amery

16

Uygulamanın aynısı, şimdi yayılma ile :

const maxDate = new Date(Math.max(...dates));

(en iyi cevaba yorum olabilir)


12

Tarihler UNIX epoch'a (sayılara) dönüştürüldüğünden, bunları bulmak için Math.max / min kullanabilirsiniz:

var maxDate = Math.max.apply(null, dates)
// convert back to date object
maxDate = new Date(maxDate)

(yalnızca Chrome'da test edilmiştir, ancak çoğu tarayıcıda çalışmalıdır)


8

** Yayılma Operatörlerini Kullanın | ES6 **

let datesVar = [ 2017-10-26T03:37:10.876Z,
  2017-10-27T03:37:10.876Z,
  2017-10-23T03:37:10.876Z,
  2015-10-23T03:37:10.876Z ]

Math.min(...datesVar);

Bu, diziden minimum tarihi verecektir.

Kestirme Math.min.apply (null, ArrayOfdates);


1
Olumsuz oy verirseniz, lütfen yorum yapın. Bu neden kötü bir seçenek? Sözdizimini seviyorum ve küçük diziler için performans cezası ihmal edilebilir.
GijsjanB

1
Ben reddedildim. Rudresh'in cevabı yukarıdaki benimkinin aynısı. İnsanların neden bundan hoşlanmadığı hakkında hiçbir fikrim yok. Bu, birçok satıra karşı tek satırlık bir koddur.

3
Bu, tarih olmayan bir sayı döndürür, bu yüzden onu tarihe geri dönüştürmeniz gerekir. Ama aksi halde oldukça zarif.
Tomáš Hübelbauer

6

ONELINER :

var min= dates.sort((a,b)=>a-b)[0], max= dates.slice(-1)[0];

değişkenler minve maxkarmaşıklık O (nlogn) ile sonuçlanır , burada düzenlenebilir örnek . Dizinizde tarih değerleri yoksa (gibi null) önce onu temizleyin dates=dates.filter(d=> d instanceof Date);.


2
var max_date = dates.sort(function(d1, d2){
    return d2-d1;
})[0];

1

Yukarıdaki cevaplar, bunu düzeltmek için boş / tanımsız değerleri işlemez Ben aşağıdaki kodu kullandım ve boşlukları NA ile değiştirdim:

function getMax(dateArray, filler) {
      filler= filler?filler:"";
      if (!dateArray.length) {
        return filler;
      }
      var max = "";
      dateArray.forEach(function(date) {
        if (date) {
          var d = new Date(date);
          if (max && d.valueOf()>max.valueOf()) {
            max = d;
          } else if (!max) {
            max = d;
          }
        }
      });
      return max;
    };
console.log(getMax([],"NA"));
console.log(getMax(datesArray,"NA"));
console.log(getMax(datesArray));

function getMin(dateArray, filler) {
 filler = filler ? filler : "";
  if (!dateArray.length) {
    return filler;
  }
  var min = "";
  dateArray.forEach(function(date) {
    if (date) {
      var d = new Date(date);
      if (min && d.valueOf() < min.valueOf()) {
        min = d;
      } else if (!min) {
        min = d;
      }
    }
  });
  return min;
}

console.log(getMin([], "NA"));
console.log(getMin(datesArray, "NA"));
console.log(getMin(datesArray));

Buraya düz bir javascript demosu ekledim ve bu codepen'de AngularJS ile filtre olarak kullandım



-2

Bir tarih dizisini yinelemek için Moment , Underscore ve jQuery kullanma .

Örnek JSON:

"workerList": [{        
        "shift_start_dttm": "13/06/2017 20:21",
        "shift_end_dttm": "13/06/2017 23:59"
    }, {
        "shift_start_dttm": "03/04/2018 00:00",
        "shift_end_dttm": "03/05/2018 00:00"        
    }]

Javascript:

function getMinStartDttm(workerList) {  
    if(!_.isEmpty(workerList)) {
        var startDtArr = [];
        $.each(d.workerList, function(index,value) {                
            startDtArr.push(moment(value.shift_start_dttm.trim(), 'DD/MM/YYYY HH:mm')); 
         });            
         var startDt = _.min(startDtArr);           
         return start.format('DD/MM/YYYY HH:mm');
    } else {
        return '';
    }   
}

Umarım yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.