Date
아래 호출을 사용하여 JavaScript에서 새 개체를 초기화 할 때 월 인수가 0부터 시작한다는 것을 알았습니다.
new Date(2010, 3, 1); // that's the 1st April 2010!
월 인수가 0에서 시작하는 이유는 무엇입니까? 반면, 날짜 인수 (마지막 날짜)는 1부터 31까지의 숫자입니다. 그럴만 한 이유가 있습니까?
the Day of the week (integer)
0 인 것도 0-6
Date
아래 호출을 사용하여 JavaScript에서 새 개체를 초기화 할 때 월 인수가 0부터 시작한다는 것을 알았습니다.
new Date(2010, 3, 1); // that's the 1st April 2010!
월 인수가 0에서 시작하는 이유는 무엇입니까? 반면, 날짜 인수 (마지막 날짜)는 1부터 31까지의 숫자입니다. 그럴만 한 이유가 있습니까?
the Day of the week (integer)
0 인 것도 0-6
답변:
프로그래밍 세계에서 오래된 (아마도 안타깝게도 죽어가는) 전통입니다. 오래된 표준 (POSIX) localtime C 함수 http://linux.die.net/man/3/localtime 참조
Date
객체는 Java 1.0에서 포팅되었습니다. 모든 결함 상속 ... stackoverflow.com/questions/344380/…
이 질문에 대한 진짜 대답은이 문제가있는에서 복사되었다는 것 java.util.Date
입니다. 증명은 원래 JavaScript ( Date
객체 포함)를 구현 한 사람인 Brendan Eich의 Twitter에서 찾을 수 있습니다 .
https://twitter.com/BrendanEich/status/481939099138654209
https://twitter.com/BrendanEich/status/771006397886533632
이것은 1995 년에 일어 났고 JDK 1.0은 베타 버전이었습니다. 1996 년에 출시되었습니다. 1997 년에 JDK 1.1이 나왔습니다.이 버전은에서 대부분의 함수를 사용하지 않고로 java.util.Date
이동 java.util.Calendar
했지만 여전히 0부터 시작하는 달이 있습니다. 이것에 지친 개발자들은 Joda-Time 라이브러리를 만들었고 궁극적으로 java.time
Java 8 (2014)에 구운 패키지로 이어졌습니다 .
간단히 말해, Java가 올바르게 설계된 날짜 / 시간 API를 내장하는 데 18 년이 걸렸지 만 JavaScript는 여전히 암흑기에 갇혀 있습니다. Moment.js , date-fns 및 js-joda 와 같은 우수한 라이브러리가 실제로 있습니다 . 그러나 현재로서는 Date
언어에 내장 된 것 이상이 없습니다 . 바라건대 이것은 가까운 장래에 바뀔 것입니다.
날짜를 제외한 모든 것은 0을 기준으로 합니다. 범위를 포함한 전체 목록은 여기를 참조하십시오. :)
실제로 여기서 이상한 일인 1 기반 날짜입니다 ... 이상하게도. 왜 그렇게 되었습니까? 모르겠어요 ...하지만 아마도 그들이 회칠을하고 세미콜론이 선택 사항이라고 결정한 같은 회의에서 일어 났을 것입니다.
{ "first", "second", "third", ..., "twenty-seventh", ... }
으로 색인을 생성하지 않기 때문일 것입니다 tm_mday
. 그런 다음 다시 한번, 그들은 한 번의 오류로 인해 규칙적으로 발생 하는 절대적인 유용성을 보았습니다 .
1 년에는 항상 12 개월이 있으므로 초기 C 구현에서는 인덱스가 0..11 인 고정 너비 배열을 사용했을 수 있습니다.
원래 질문에 대한 답이 아니라는 것을 알고 있지만이 문제에 대한 제가 선호하는 해결책을 보여 드리고 싶었습니다.
작은 함수 zerofill은 필요한 곳에 0을 채우는 트릭을 수행하고 월이 +1
추가됩니다.
function zerofill(i) {
return (i < 10 ? '0' : '') + i;
}
function getDateString() {
const date = new Date();
const year = date.getFullYear();
const month = zerofill(date.getMonth()+1);
const day = zerofill(date.getDate());
return year + '-' + month + '-' + day;
}
하지만 예, Date에는 매우 직관적이지 않은 API가 있습니다. Brendan Eich의 Twitter를 읽을 때 웃고있었습니다.
월을 열거 (첫 번째 인덱스가 0 임)로 간주하고 이름이 연결되지 않은 날이 아닌 것으로 간주했을 수 있습니다.
또는 오히려 그들은 숫자를 변수로 열거 할 수있는 것처럼 하루의 숫자가 실제 하루의 표현이라고 생각했습니다 (12/31과 같은 날짜에서 월이 숫자로 표현되는 것과 같은 방식). 0 기반.
따라서 실제로 몇 달 동안은 적절한 열거 표현이 숫자 대신 월 이름을 사용하는 것이라고 생각했고, 일에 이름 표현이 있다면 똑같이했을 것입니다. 1 월 5 일, 1 월 6 일 등이 아니라 1 월 5 일, 1 월 6 일이라고한다면 아마도 며칠 동안 0 기반 열거를 만들었을 것입니다.
아마도 그들은 무의식적으로 몇 달 동안은 {1 월, 2 월, ...}으로, 며칠 동안은 {One, Two, Three, ...}로 열거하는 것을 생각했을 것입니다. 단, 이름이 아닌 숫자로 하루에 액세스하는 날을 제외하고는, 1 for One 등과 같이 0에서 시작할 수 없습니다.
결함이있을 수 있지만 월 또는 요일을 문자열로 표현하려는 경우에도 매우 편리합니다. [ 'jan,'feb '... etc] [new Date ()와 같은 배열을 만들 수 있습니다. .getMonth ()] 대신 [ '', 'jan', feb ... etc] [new Date (). getMonth ()] 또는 [ 'jan', 'feb'... etc] [new Date ( ) .getMonth ()-1]
월의 날짜는 일반적으로 이름이 지정되지 않으므로 해당 이름으로 배열을 만들지 않을 것입니다. 이 경우 1-31이 다루기 쉬우므로 매번 1을 빼야합니다.