JavaScript Date를 자정으로 초기화하는 가장 좋은 방법은 무엇입니까?


439

new Date () 인스턴스를 가져 와서 자정에 시간을 설정하는 가장 간단한 방법은 무엇입니까?

답변:


874

setHours방법은 선택이 걸릴 수 있습니다 minutes, seconds그리고 ms예를 들어, 인수 :

var d = new Date();
d.setHours(0,0,0,0);

UTC 시간으로 작업하려면이 시간대00:00:00.000 를 사용 하여 현재 시간대 의 시간을 설정합니다 setUTCHours.


41
참고로, 270K 행의 reduce 함수 에서이 메소드 (d.setHours (0,0,0,0))를 실행 중이며 d.setHours (0)보다 20 초 이상 빠릅니다. d.setMinutes (0); d.setSeconds (0); 좋은 답변 @CMS!
jbnunn

32
d를 Date 객체로 유지하려면 두 줄로 수행해야합니다. 최근에 한 줄에 버그를 수정했습니다 : var d = new Date (). setHours (0, 0, 0, 0). 그러나 d는 setHours가 숫자를 반환하므로 날짜가 아닌 숫자입니다.
Jason

9
방금 날짜를 반환하는 한 줄 솔루션이 필요합니다. @Zon의 대답 은 이것을 찾는 사람에게 완벽하게 작동합니다 new Date(new Date().setHours(0,0,0,0)).
SRack

226

수락 된 답변의 스 니펫 이 과거에 가장 가까운 자정을 제공한다는 것을 분명히하고 싶었습니다 .

var d = new Date();
d.setHours(0,0,0,0); // last midnight

미래에 가장 가까운 자정 을 얻으려면 다음 코드를 사용하십시오.

var d = new Date();
d.setHours(24,0,0,0); // next midnight

6
오늘 시간이 25 시간 (일광 절약을 위해 시계가 앞으로 조정되는 경우)은 어떻게됩니까?
qntm

8
이것은 클라이언트 측 스크립트이며 자정은 일광 절약 시간에도 불구하고 자정입니다. 또한 주목할만한 언급 .. 세계의 모든 장소가 DST (일광 절약 시간)를 사용하는 것은 아닙니다
chris

2
@qntm : 일광 절약 시간제 변경은 항상 오전 2시에서 오전 4 시까 지 적용되므로 해당 날짜에는 자정이 한 번만 적용됩니다. :). 그러나 그렇습니다, 오전 3시는 하루에 두 번 일어날 수 있습니다 (facepalm)
Dan

@ chris 아니오, 두 번째 스 니펫을 의미합니다. "오늘 자정 24 시간 후"가 "내일 자정"과 항상 같은 것은 아닙니다. 이 경우 두 번째 스 니펫이 작동합니까?
qntm

3
@qntm : Date.setHours는 맹목적으로 24 시간을 추가하지 않습니다. 더 지능적입니다. 대신, 다음에 24시에 시계가 표시 될 순간의 타임 스탬프를 반환합니다. 시간 절약을 고려합니다. 콘솔에서 직접 연주하십시오. 흥미롭고 setHours (25)는 내일의 시간 소인을 반환합니다. 오전 1시
Dan

68

객체 구성을위한 단일 라이너 :

new Date(new Date().setHours(0,0,0,0));

요소를 만들 때 :

dateFieldConfig = {
      name: "mydate",
      value: new Date(new Date().setHours(0, 0, 0, 0)),
}

6
감사! 객체 속성을 설정했기 때문에 한 줄로 어떻게 할 수 있는지 궁금합니다! 좋은 대답입니다.
Paulo Roberto Rosa

고마워 Zon, 이것은 한 줄로 작성하는 데 도움이되었습니다.
HungrySoul

22

이 페이지에 방문 하여 moment.js 에서이 작업을 수행하는 방법을 찾고 있기 때문에 여기에 추가하면됩니다 .

[Rationale : "모멘트"라는 단어가 이미이 페이지의 다른 곳에 나타나므로 검색 엔진이 여기에 지시하고 moment.js 는 다른 날짜 관련 SO 질문에서 얼마나 자주 언급되는지에 대해 다루기 위해 충분히 널리 퍼져 있습니다.]

따라서 버전 2.0.0 이상에서 :

date.startOf('day');

이전 버전의 경우 :

date.sod();

문서 :

http://momentjs.com/docs/#/manipulating/start-of/


날짜 객체를 되 moment(DATE_OBJECT).startOf('day').toDate();
찾으

2
예, 52kb 자바 스크립트 라이브러리를 추가하여 2 줄로 할 수있는 작업을 수행 할 수 있습니다.
Bruce Lim

19
그리고 이미 많은 이유 중 하나 때문에 moment.js를 이미 사용하고 있다면 어떨까요? 냉소적 인 의견을 추가하기 전에 내가 준 근거를 읽는 것은 어떻습니까?
andyhasit

11

아마 사용할 수 있습니다

new Date().setUTCHours(0,0,0,0)

값이 한 번만 필요한 경우


1
OP가 필요하므로 Date의 인스턴스를 얻지 못합니다.
cobberboy

이것은 최선의 대답이지만 Date의 인스턴스를 반환하려면 약간의 편집이 필요합니다. 새로운 날짜 (new Date (). setUTCHours (0, 0, 0, 0));
VitFL

4

@Dan의 예에 유용성을 추가하여 다음 정오 또는 자정을 찾아야했습니다.

var d = new Date();
if(d.getHours() < 12) {
   d.setHours(12,0,0,0); // next midnight/midday is midday
} else {
   d.setHours(24,0,0,0); // next midnight/midday is midnight
}

이를 통해 이벤트에 대한 게재 빈도 설정을 할 수 있었으며 내 사이트 방문자는 아침에 한 번, 오후에 한 번만 발생할 수있었습니다. 캡처 된 날짜는 쿠키 만료를 설정하는 데 사용되었습니다.


4

여름철 날짜로 계산하면 자정 (CEST)보다 1 시간 더 많거나 1 시간 더 적게 발생합니다. 날짜가 반환 될 때 1 일 차이가 발생합니다. 따라서 날짜는 가장 가까운 자정으로 반올림해야합니다. 따라서 코드는 다음과 같습니다 (jamisOn).

    var d = new Date();
    if(d.getHours() < 12) {
    d.setHours(0,0,0,0); // previous midnight day
    } else {
    d.setHours(24,0,0,0); // next midnight day
    }

3

나는 이것을 위해 몇 가지 프로토 타입을 만들었습니다.

// This is a safety check to make sure the prototype is not already defined.
Function.prototype.method = function (name, func) {
    if (!this.prototype[name]) {
        this.prototype[name] = func;
        return this;
    }
};

Date.method('endOfDay', function () {
    var date = new Date(this);
    date.setHours(23, 59, 59, 999);
    return date;
});

Date.method('startOfDay', function () {
    var date = new Date(this);
    date.setHours(0, 0, 0, 0);
    return date;
});

안전 검사를 원하지 않으면 그냥 사용할 수 있습니다.

Date.prototype.startOfDay = function(){
  /*Method body here*/
};

사용법 예 :

var date = new Date($.now()); // $.now() requires jQuery
console.log('startOfDay: ' + date.startOfDay());
console.log('endOfDay: ' + date.endOfDay());

2

d3.js가 이미 프로젝트에 종속성으로 있거나 가져와도 괜찮은 경우 d3 시간 ( d3.js 라이브러리는 v4.0.0에서 모듈 식임 )에 Intervals가 있습니다.

날짜를 "기본"값 (예 : 자정, 0.00 초, 매월 1 일 등)으로 설정할 때 유용 할 수 있습니다.

var d = new Date(); // Wed Aug 02 2017 15:01:07 GMT+0200 (CEST)
d3.timeHour(d) // Wed Aug 02 2017 00:00:00 GMT+0200 (CEST)
d3.timeMonth(d) // Tue Aug 01 2017 00:00:00 GMT+0200 (CEST)

SO에 게시 된 JavaScript 관련 질문의 추세를 발견했습니다. 기본 JS를 사용하여 제시된 솔루션의 복잡성에 관계없이 외부 라이브러리의 도움으로 문제를 해결하는 답변은 필연적으로 어느 시점에서 다운 보트됩니다. 이를 실현하기 위해 빠른 서문을 사용하여 답변을 게시하는 데주의를 기울 였습니다. 이미 example.js를 종속성으로 사용하는 경우 . 그럼에도 불구하고 여전히 익명의 SO 사용자? 아파, 남자 : '-(
Peemster

나는 moment.js의 사용을 제안하는 것이 16 개의 투표권을 가지고 있기 때문에 (이 의견을 쓰는 순간)이 답변에 투표하지 말아야한다고 생각했다. 그것은 매우 간결한 방식으로 문제를 해결하지 못합니다.
lukeatdesignworks 작품
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.