JavaScript의 Date 생성자에서 월 인수 범위가 0에서 11까지 인 이유는 무엇입니까?


128

Date아래 호출을 사용하여 JavaScript에서 새 개체를 초기화 할 때 월 인수가 0부터 시작한다는 것을 알았습니다.

new Date(2010, 3, 1);  // that's the 1st April 2010!

월 인수가 0에서 시작하는 이유는 무엇입니까? 반면, 날짜 인수 (마지막 날짜)는 1부터 31까지의 숫자입니다. 그럴만 한 이유가 있습니까?


96
그것은 당신의 발가락을 유지하는 것입니다.
SeanJA

4
인덱스가 the Day of the week (integer)0 인 것도 0-6
SeanJA

인간이 아닌 기계 용으로 코딩 되었기 때문입니다. 많은 코드가 (여전히) 인간에 의해 작성된 :)이기 때문에하지만 여전히 버그의 거대한 소스
크리스토프 후씨

4
@Christophe 같은 주장이 연도에도 적용되어야합니다.
Agnel Kurian

2
@ChristopheRoussy 예, 기계 용으로 코딩 된 경우 왜 1부터 일을 색인화합니까?
user151496

답변:


55

프로그래밍 세계에서 오래된 (아마도 안타깝게도 죽어가는) 전통입니다. 오래된 표준 (POSIX) localtime C 함수 http://linux.die.net/man/3/localtime 참조


14
JS Date객체는 Java 1.0에서 포팅되었습니다. 모든 결함 상속 ... stackoverflow.com/questions/344380/…
c69

1
... 당신이 바로, 전통은 일반적으로 비이성적 번 완전히 일치하고 종종하고 난 정말 그와 같은 "나쁜"전통 정말 죽어 가고 희망
HENON

1
2019 내가 자바 스크립트 그나마 지원 중단이 여전히 일어날 것 같은 각도로 프레임 워크와 언어로 너무 오래,이 문제와 관련된 문제를 해결하고 - ;-) 2025 년과에 COMENT 주시기
마우 그라시아 구티에레즈

그것은 항상 날짜 문제를 디버깅하는 데 시간을 보내는 전통입니다.이 전통이 얼마나 많은 시간을 낭비하는지 궁금합니다.
Vedmant

102

이 질문에 대한 진짜 대답은이 문제가있는에서 복사되었다는 것 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.timeJava 8 (2014)에 구운 패키지로 이어졌습니다 .

간단히 말해, Java가 올바르게 설계된 날짜 / 시간 API를 내장하는 데 18 년이 걸렸지 만 JavaScript는 여전히 암흑기에 갇혀 있습니다. Moment.js , date-fnsjs-joda 와 같은 우수한 라이브러리가 실제로 있습니다 . 그러나 현재로서는 Date언어에 내장 된 것 이상이 없습니다 . 바라건대 이것은 가까운 장래에 바뀔 것입니다.


24
아 ... 좋은 오래된 데모 기반 개발 방법론.
Álvaro González

@ ÁlvaroGonzález 나는 처음에 그것을 소개 한 원래 JDK 1.0 개발자를 비난 할 것입니다.
barell

30

날짜를 제외한 모든 것은 0을 기준으로 합니다. 범위를 포함한 전체 목록은 여기를 참조하십시오. :)

실제로 여기서 이상한 일인 1 기반 날짜입니다 ... 이상하게도. 왜 그렇게 되었습니까? 모르겠어요 ...하지만 아마도 그들이 회칠을하고 세미콜론이 선택 사항이라고 결정한 같은 회의에서 일어 났을 것입니다.


1
"일 기반"날짜는 아마도 올바른 생각을 가진 사람이 일 (예 :)에 대한 문자열 이름 배열을 만들고 { "first", "second", "third", ..., "twenty-seventh", ... }으로 색인을 생성하지 않기 때문일 것입니다 tm_mday. 그런 다음 다시 한번, 그들은 한 번의 오류로 인해 규칙적으로 발생 하는 절대적인 유용성을 보았습니다 .
D.Shawley

연도가 0이 아닌 이유는 무엇입니까?
Vedmant


4

자바에서도 이와 비슷합니다. 아마도 int를 문자열 (0-jan, 1-feb)로 변환하려면 이런 식으로 코딩했습니다. 왜냐하면 월 이름과 이번 달의 문자열 배열 (0에서 인덱싱)을 가질 수 있기 때문입니다. 숫자가 0부터 시작하면 월 문자열에 매핑하는 것이 훨씬 쉽습니다 ..


3

원래 질문에 대한 답이 아니라는 것을 알고 있지만이 문제에 대한 제가 선호하는 해결책을 보여 드리고 싶었습니다.

작은 함수 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를 읽을 때 웃고있었습니다.


2

월을 열거 (첫 번째 인덱스가 0 임)로 간주하고 이름이 연결되지 않은 날이 아닌 것으로 간주했을 수 있습니다.

또는 오히려 그들은 숫자를 변수로 열거 할 수있는 것처럼 하루의 숫자가 실제 하루의 표현이라고 생각했습니다 (12/31과 같은 날짜에서 월이 숫자로 표현되는 것과 같은 방식). 0 기반.

따라서 실제로 몇 달 동안은 적절한 열거 표현이 숫자 대신 월 이름을 사용하는 것이라고 생각했고, 일에 이름 표현이 있다면 똑같이했을 것입니다. 1 월 5 일, 1 월 6 일 등이 아니라 1 월 5 일, 1 월 6 일이라고한다면 아마도 며칠 동안 0 기반 열거를 만들었을 것입니다.

아마도 그들은 무의식적으로 몇 달 동안은 {1 월, 2 월, ...}으로, 며칠 동안은 {One, Two, Three, ...}로 열거하는 것을 생각했을 것입니다. 단, 이름이 아닌 숫자로 하루에 액세스하는 날을 제외하고는, 1 for One 등과 같이 0에서 시작할 수 없습니다.


심리학자에게 이중 클래스를해야합니다. 여전히 그들이 저지른 실수이지만 적어도 우리는 그들이 왜 그랬는지 이해합니다.
Zesty

0

결함이있을 수 있지만 월 또는 요일을 문자열로 표현하려는 경우에도 매우 편리합니다. [ 'jan,'feb '... etc] [new Date ()와 같은 배열을 만들 수 있습니다. .getMonth ()] 대신 [ '', 'jan', feb ... etc] [new Date (). getMonth ()] 또는 [ 'jan', 'feb'... etc] [new Date ( ) .getMonth ()-1]

월의 날짜는 일반적으로 이름이 지정되지 않으므로 해당 이름으로 배열을 만들지 않을 것입니다. 이 경우 1-31이 다루기 쉬우므로 매번 1을 빼야합니다.


별로. 쉽게 빼면됩니다. 그것은 해결하는 것보다 더 많은 문제를 만들어냅니다. 이제 날짜로 수학을 할 때, 그 달에 특정한 조작을 자주해야하기 때문입니다.
Rey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.