2014 년 12 월 31 일로 설정된 new Date () 대신 12 월 1 일이 표시됨


80

문자열을 Date 객체로 변환하려고하는데 12 월 31 일을 제외한 모든 날에 작동합니다. 객체별로 31 일 대신 12 월 1 일이 표시됩니다. 나는 이유를 모른다. 내 JavaScript코드 는 다음과 같습니다 .

var dt = new Date();
dt.setDate("31");
dt.setMonth("11");
dt.setFullYear("2014");

하지만 내 변수 값은 다음과 같습니다.

Mon Dec 01 2014 11:48:08 GMT+0100 (Paris, Madrid)

다른 날짜에 대해 동일한 작업을 수행하면 개체가 적절한 값으로 돌아갑니다. 내가 뭘 잘못했는지 알아?


7
문자열이 아닌 setMonth 등에 정수를 전달해야합니다.
funkybro 2014 년

15
Date생성자의 매개 변수를 직접 사용할 수 있습니다 .new Date(2014, 11, 31)
pomeh 2014 년

9
btw. 11 월 11 월이 아닙니까?
jnovacho 2014 년


5
@JuhaUntinen 아니요, 지금 은 한 달 이 30 일 밖에 없기 때문에 날짜가 뒤 바뀌 었습니다 .
Mr Lister

답변:


85

setMonth 전에해야 setDate: ( 31 일 미만의 개월 동안 안전하지 않음 )

var dt = new Date();
dt.setFullYear(2014);
dt.setMonth(11);
dt.setDate(31);

그리고 setMonth의 두 번째 매개 변수를 사용하여 날짜를 설정할 수도 있습니다.

var dt = new Date();
dt.setFullYear(2014);
dt.setMonth(11, 31);


생성자에 대한 인수가 제공되지 않으면 시스템 설정에 따라 현재 날짜와 시간 이 사용됩니다 .

따라서 setMonthsetDate별도로 사용하면 여전히 예기치 않은 결과가 발생할 수 있습니다.

설정된 값이 논리 범위보다 크면 값이 인접한 값 으로 자동 조정됩니다 .

예를 들어 오늘이 2014-09-30이면

var dt = new Date();
dt.setFullYear(2014); /* Sep 30 2014 */
dt.setMonth(1);       /* Mar 02 2014, see, here the auto adjustment occurs! */
dt.setDate(28);       /* Mar 28 2014 */

이를 방지하려면 생성자를 직접 사용하여 값을 설정하십시오.

var dt = new Date(2014, 11, 31);

1
사실 방금 알아
냈지만

15
@ user2859409 먼저 달을 설정하지 않는 경우는 현재 월 소요하고 때로는 (아래의 Jakub의 대답에 따라) 다음 달에 마무리 할 수 있기 때문에 아마
fbstj

3
31 일 미만으로 몇 달 동안 첫 번째 코드 블록을 권장하는 것을 주저합니다. 예를 들어, 날짜를 9 월 15 일로 설정하고 싶지만 오늘이 8 월 31 일인 경우 날짜는 다음 달로 끝나고 10 월 15 일이됩니다. 두 번째 코드 블록의 경우 +1 : 더 좋은 방법입니다. 2 인수 형태의 setMonth존재 조차 몰랐습니다 .
Luke Woodward

10
하루 전 달을 설정하는 것도 잘못 될 수 있습니다. 하지만이 경우에는 그렇지 않습니다. 10 월 31 일이면 setMonth (10)는 날짜를 11 월 31 일로 설정하고 12 월 1 일로 줄 바꿈합니다. setDate (31)는 12 월 31 일이됩니다. 따라서 항상 2 인수 setMonth ()를 사용하십시오.
Florian F

1
+1하지만 부작용을 예방하기 위해 2 개월 옵션이 선호된다는 점을 강조하고 싶습니다.
Brian

120

요일을 먼저 설정하면 여전히 이번 달이므로 9 월입니다. 9 월은 30 일 밖에 없습니다.

var dt = new Date(); /* today */
dt.setDate("31"); /* 1st Oct 2014 as should be by spec */
dt.setMonth("11"); /* 1st Dec 2014 */
dt.setFullYear("2014"); /* 1st Dec 2014 */

22
+1-이것은 8 월 내내 잠자고있는 벌레의 종류입니다. 그리고 9 월에 당신을 엉덩이에 물
립니다

19
하루 실패의 경우가 처음이 있기 때문에 한 번에 날짜를 하나 개의 구성 요소를 설정하는 것이 올바른 결코 없습니다 첫 달, 그리고 2/29에 첫 해에 아마도. 세 필드를 동시에 모두 설정해야합니다.
Jim Garrison

5
+1을해야하는 이유는 월을 먼저 설정해야하는 이유를 설명하기 때문입니다. 그것은 매우 자바 스크립트 WTF입니다
Danubian Sailor

2
다른 언어에서도 유사해야하므로 "javascript WTF"가 아닙니다.
Raidri 모니카 지원

잘못된 날짜가 설정되었을 때 Date 객체가 throw되지 않는 이유는 무엇입니까?
jww

23

당신이 가장 먼저하는 일은

dt.setDate(31)

이것은 현재 날짜를 31로 설정합니다. 이번 달은 30 일이있는 9 월이므로 반올림합니다.

이 시점 이후에 날짜를 인쇄하면 10 월 1 일이됩니다.


12
재미있는 것은 그가 30 일 동안 한 달 동안 시도했기 때문에 나타납니다. 한 달 후에는 제대로 작동하는 것처럼 보였을 것입니다.
Peter

13

귀하의 의도가 연도, 월 및 날짜를 ​​동시에 설정하는 것이라고 가정하면 더 긴 날짜 생성자를 사용할 수 있습니다 .

새로운 날짜 (년, 월, 일,시, 분, 초, 밀리 초);

[...]

두 개 이상의 인수가 제공되면 누락 된 인수는 1 (일이 누락 된 경우) 또는 다른 모든 인수에 대해 0으로 설정됩니다.

따라서 다음과 같이 작성합니다.

var dt = new Date(2014, 11, 31);

이미 설정 한대로 날짜의 한 부분을 한 번에 설정하면 오버플로가 발생할 수 있습니다.

var dt = new Date(2012, 1, 29); // Feb 29 2012
dt.setFullYear(2014);           // Mar 01 2014 instead of Feb 28 2014

또한 날짜 전 달을 설정하면 예상치 못한 오버플로가 발생할 수 있습니다 (방법 순서 변경을 권장하는 답변이 올바르지 않음).

var dt = new Date(2014, 0, 31); // Jan 31 2014
dt.setFullYear(2014);           // Jan 31 2014
dt.setMonth(1);                 // Mar 03 2014 instead of Feb 28 2014
dt.setDate(1);                  // Mar 01 2014

이 답변이 마음에 듭니다. 상단에서 올바른 솔루션을 제공하고 깨진 솔루션이 작동하지 않는 이유를 설명하기 때문입니다.
Kip

7

행동의 이유와 그것을 피하는 방법이 충분히 설명되었습니다.

그러나 코드의 실제 오류는 기본 생성자 인 new Date ()를 사용해서는 안된다는 것입니다. 코드는 현재 시간과 함께 12 월 13 일에 날짜가됩니다. 나는 이것이 당신이 원하는 것인지 의심합니다. 연, 월, 일을 매개 변수로 사용하는 Date 생성자를 사용해야합니다.


1
받아 들인 답변에 대한 의견이라고 생각합니까?
Danubian Sailor

별로. "내가 뭘 잘못 했어?"라는 질문에 대한 답입니다.
Florian F

-1

날짜 설정의 올바른 순서는 다음과 같습니다.

  • setFullYear ()
  • setMonth ()
  • setDate ()

윤년의 2 월 29 일 때문에 처음에 연도를 설정하는 것도 중요하다는 점을 지적하고 싶습니다.


1
아니요. 주문이 날짜가 올바르게 설정된다는 보장은 없습니다. 수락 된 답변과 가장 많이 투표 한 답변 아래의 댓글을 참조하세요.
Salman A

1
시작일이 31 일이고 30 일과 같이 더 적은 월로 설정하면 다음 달이됩니다. 그래서 이것만으로는 충분하지 않습니다. 안전을 위해 월을 설정하기 전에 날짜를 28 일 이하로 설정해야합니다. 마지막으로 날짜가 더 높은 경우 최종 값으로 다시 설정합니다.
bart

-3
var dt = new Date();
dt.setFullYear(2014);
dt.setMonth(11);
dt.setDate(31);

문자열이 아닌 정수로 값을 전달합니다. 올바른 값을 반환합니다 ..


업데이트 -위의 설명이 맞지 않습니다 .. 주된 문제는이 세 줄을 올바른 순서로 넣어야한다는 것이 었습니다 .. 시퀀스를 수정 한 후에도 설명을 수정하는 것을 잊었습니다 .. : P


아니요, 여기에 크롬 콘솔의 테스트가 있습니다. var dt = new Date (); 정의되지 않음 dt.setDate (31); 1412157761255 dt.setMonth (11); 1417431761255 dt.setFullYear (2014); 1417431761255 dt 2014 년 12 월 1 일 월요일 12:02:41 GMT + 0100 (파리, 마드리드)
user2859409

6
인수의 유형 및 시퀀스와 관련된 모든 것과 관련이 없습니다. 당신은 그것이 부차적 인 것처럼 시퀀스를 언급하고 있습니다 ...
dee-see

1
해당 코드가 작동 하는 동안 잘못된 설명을 제공했습니다 .
Danubian Sailor 2014 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.