오늘은 JavaScript의 getMonth() 메서드로 달을 구할 시 왜 실제 달보다 1이 적은 값이 반환되는 지에 대해 알아보고자 한다.
1. 개요
자바스크립트에서 날짜를 구하려면 Date 객체를 활용해야 한다.
Date객체의 인스턴스의 달(月)을 구하려면 아래 예시의 사용처럼 getMonth() 메서드를 사용한다.
const today = new Date();
const year = today.getFullYear();
const month = today.getMonth()+1;
const day = today.getDate();
console.log(`${year}.${month}.${day}`) // result: 2024.1.11 (작성일(2024. 01. 11기준)
그런데 왜 getMonth() 메서드 뒤에만 +1이 붙는 것일까?
이에 대한 간단한 답으로는 getMonth()메서드는 Zero-base로 설정되어 있기 때문에 +1을 해줘야 정상적인 해당 달이 출력된다. 그렇다면, 만일 getFullYear()이나 getDate()도 Zero-base로 설정되어 있었다면 납득했을 것인데, 왜 getMonth()에서만 Zero-base로 되어 있을까?
2. 해답
JavaScript의 날짜 표기는 Java JDK1.0(1995) 버전을 카피했다고 한다.
*JDK = Java Development Kit(자바 개발 키트)
Java에서 날짜와 시간을 다루려면 java.util.Date 클래스와 java.util.Calendar 클래스를 사용해야 하는데 JDK 8(2014) 이전에 버전은 여러 가지 문제점이 있었다.
특히 위에서 언급한 “Zero-base month” 문제가 JDK 8버전 이전까지 계속 사용되어온 것으로 보인다. 이에 불만을 품은 유저들은 Joda-Time과 같은 오픈소스 라이브러리를 만들어 사용했으나 결국 JDK 8 이후에 날짜와 시간 API가 개선되었다.
따라서 JavaScript의 날짜와 시간 표기 방식은 JDK 8이전의 방식을 채택하고 있으므로 발생하는 작은 문제라고 한다.
(따라서 기존 방식이 이렇게 설계되어 왔으니, 후에 개선하려 하여도 쉽게 바뀔 수 없는 문제인 듯 보인다..)
이에 JavaScript 창조자인 브렌던 아이크(Brendan Eich)는 트위터에 아래와 같이 언급하였다.
"I had ten days to demo. No time to invent our own date API or even fix Java's”
("데모하는 데 10일이 걸렸습니다. 자체 날짜 API를 만들거나 Java를 고칠 시간도 없었습니다.”)
라고 답변하였다.
10일 만에 JavaScript 데모를 만들어낼 정도의 능력자이니 이정도 작은 실수는 살짝 눈 감아주는것이 좋을듯 싶다.
3. 결론
JavaScript가 채택한 날짜와 시간 표기법은 JDK 8 이전 버전에서 설정 되어있는 "Zero-base month" 기능의 영향으로 getMonth() 메서드를 사용할 시 뒤에 +1을 추가로 입력하여 해당 달의 값과 맞추어 사용해야 한다.
#References
https://stackoverflow.com/questions/18624326/getmonth-in-javascript-gives-previous-month
https://velog.io/@dave_ahn93/getMonth-%EB%A9%94%EC%84%9C%EB%93%9C%EC%9D%98-%EC%8B%A4%EC%B2%B4
https://bobbyhadz.com/blog/javascript-date-getmonth-returns-wrong-month
'Javascript/Typescript' 카테고리의 다른 글
[JavaScript] JavaScript의 `this` 키워드에 대한 이해 (0) | 2024.12.17 |
---|---|
[JavaScript] CSV파일 한글 깨짐 현상 해결: ANSI인코딩 저장 방법 (0) | 2023.06.11 |
[Javascript] Array 메서드(map, reduce, flatMap) (0) | 2022.10.10 |
[이슈] MediaRecorder(Web API)로 촬영한 webm 영상이 정상 재생되지 않음 (0) | 2022.09.30 |
[Node.js] fs 모듈로 파일 입출력 처리 (0) | 2022.09.28 |