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

문자열을 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)

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



답변

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


답변

요일을 먼저 설정하면 여전히 이번 달이므로 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 */


답변

당신이 가장 먼저하는 일은

dt.setDate(31)

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

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


답변

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

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

[…]

두 개 이상의 인수가 제공되면 누락 된 인수는 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


답변

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

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


답변

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

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

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


답변

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

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


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