배열의 최소 / 최대 날짜?


106

날짜 배열에서 최소 및 최대 날짜를 어떻게 찾을 수 있습니까? 현재 다음과 같은 배열을 만들고 있습니다.

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

이 작업을 수행하는 내장 함수가 있습니까? 아니면 직접 작성해야합니까?

답변:


137

코드는 IE, FF, Chrome으로 테스트되었으며 제대로 작동합니다.

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
문자열 '2011/06/25'가 아닌 새 날짜 ( '2011/06/25')에 대해 숫자 변환이 적용되었습니다. 번호 (새 날짜 ( '2011/06/25')) === 1308949200000. 코드는 Chrome, IE, FF
Andrew D

@RobG- "문자열 날짜"란 무엇을 의미합니까?
Andrew D.

예 : dates.push('2011/06/05'). 문자열을 사용하여 배열을 간단히 정렬하고 첫 번째 및 마지막 멤버 값을 반환하고 필요한 경우 날짜로 변환 할 수 있습니다.
RobG 2011-08-23

10
@RobG-위의 질문에서 배열에는 "날짜 문자열"이 아닌 Date 객체가 포함되어 있습니다. Date 객체에도 응답합니다. "날짜 문자열"을 사용하는 것은 어떤 경우에는 매우 나쁜 습관입니다. 다음 두 날짜 문자열 인 "2011/06/05"및 "2011/06/05 00:00:00"을 비교합니다. 1) 문자열 : ( "2011/06/05"=== "2011/06/05 00:00:00") : 결과가 거짓입니다. 2) as Date 객체 (숫자로 변환) : Number (new Date ( "2011/06/05")) === Number (new Date ( "2011/06/05 00:00:00")) : 결과 사실입니다-올바른 결과입니다!
Andrew D.

@AndrewD. dateStrings가 일관성 YYYY/MM/DD HH:MM:SS이 있고 관련 문자열이 많은 경우 문자열 비교 또는 Number(new Date(dateString))비교 를 권장 합니까?
BlackPanther 2016-08-04

83

다음과 같은 것 :

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에서 테스트 됨


Array.reduce()IE9 이전의 IE에서는 사용할 수 없습니다. 그래도 멋진 아이디어.
jfriend00

1
Array.reduce은 () 자바 스크립트 동등한 기능을 구현할 수 있습니다
앤드류 D.을

정확히, Eloquent 자바 스크립트 에서 그것에 대해 읽어 보세요 :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는 죽을 수 있으며 실제로 2013 년 4 월 현재 전 세계 브라우저 사용의 9.3 %에 불과합니다.
wprl

3
축소 솔루션은 문자열 및 날짜 개체에 대해 작동합니다.
Benoit

33

_.min_.max날짜의 배열에서 작동; Lodash 또는 Underscore를 사용하는 경우이를 사용하고 아직 사용하지 않은 경우 Lodash (이러한 많은 유틸리티 기능을 제공하는) 사용을 고려하십시오.

예를 들면

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

배열의 두 번째 날짜를 반환합니다 (가장 빠른 날짜이기 때문).


3
OP의 질문에 직접 답변하지 않습니다. OP는 JavaScript에서 내장 메소드를 사용할 수 있는지 묻습니다. 따라서 _.min & _.max는 최소 또는 최대 날짜를 찾는 데 사용할 수 있지만 OP가 찾고있는 것은 아닙니다. 또한 유틸리티 라이브러리에 대한 고려는 의견이 많은 주제입니다.
detj

13
나는 정중하게 동의하지 않으며 이것이 유용한 대답이라고 생각합니다. OP가 제안한 솔루션 중 하나의 대안으로 유틸리티 라이브러리를 지적하는 것이 합리적입니다. 그러나 당신의 추론은 변명 할 수 있고 당신의 투표는 당신 자신의 것입니다.
마크 Amery

16

적용과 동일, 이제 스프레드 포함 :

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

(우수 답변에 대한 의견 일 수 있음)


12

날짜는 UNIX epoch (숫자)로 변환되므로 Math.max / min을 사용하여 찾을 수 있습니다.

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

(Chrome에서만 테스트되었지만 대부분의 브라우저에서 작동합니다)


8

** 분산 연산자 사용 | 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);

그러면 어레이의 최소 날짜가 제공됩니다.

그것의 축약 형 Math.min.apply (null, ArrayOfdates);


1
반대 투표하면 의견을 말하십시오. 이것이 왜 나쁜 선택입니까? 나는 구문을 좋아하고 작은 배열의 경우 성능 패널티는 무시할 수 있습니다.
GijsjanB

1
나는 반대표를 받았다. Rudresh의 대답은 위의 내 중복입니다. 사람들이 왜 이것을 좋아하지 않는지 모릅니다. 한 줄의 코드 대 여러 줄입니다.

3
이것은 날짜가 아닌 숫자를 반환하므로 날짜로 다시 변환해야합니다. 그러나 그렇지 않으면 꽤 우아합니다.
Tomáš Hübelbauer

6

원 라이너 :

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

결과 변수 minmax복잡성 O (nlogn) , 여기 에서 편집 가능한 예제 . 배열에 날짜가없는 값 (예 null:)이있는 경우 먼저 dates=dates.filter(d=> d instanceof Date);.


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

1

위의 답변은이 문제를 해결하기 위해 공백 / 정의되지 않은 값을 처리하지 않습니다. 아래 코드를 사용하고 공백을 NA로 대체했습니다.

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

여기에 일반 자바 스크립트 데모를 추가 하고이 코드 펜 에서 AngularJS와 함께 필터로 사용했습니다.


0

이것은이를 수행하는 특히 좋은 방법입니다 (객체 속성 중 하나를 사용하여 최대 객체 배열을 얻을 수 있음). Math.max.apply(Math,array.map(function(o){return o.y;}))

다음은이 페이지에 대한 답변 입니다. 객체 배열에서 속성의 최대 값 찾기


-2

사용하는 순간 , 밑줄jQuery를하는 날짜의 배열을 반복합니다.

샘플 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"        
    }]

자바 스크립트 :

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

도움이되기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.