JavaScript의 Date 컨스트럭터에서 month 인수의 범위는 왜0 ~ 11 인가요?
시Date
아래 호출을 사용하여 JavaScript에서 객체를 생성하면 month 인수가 0부터 카운트된다는 것을 알 수 있습니다.
new Date(2010, 3, 1); // that's the 1st April 2010!
month 인수는 왜0부터 시작합니까?한편, day of month 인수(마지막 1개)는 1 ~31 의 숫자입니다.여기에는 좋은 이유가 있나요?
의 진짜 은 이 입니다.java.util.Date
자바스크립트를 수 .JavaScript e의 Brendan Eich 의rendrendrend 。
https://twitter.com/BrendanEich/status/481939099138654209
https://twitter.com/BrendanEich/status/771006397886533632
Brendan은 또한 자바에서 포팅을 한 사람이 Netscape의 Ken Smith임을 나타냅니다.
https://twitter.com/BrendanEich/status/771006208949891072
1995년, JDK 1.0년했다.1.되어 1997년 JDK 1.1의 되었습니다.java.util.Date
해서 로로이 to to to to ,로 넘어갑니다.java.util.Calendar
하지만 그마저도 여전히 0개월이었다.이에 진저리가 난 개발자들은 Joda-Time 라이브러리를 만들었고, 이는 결국 다음과 같은 결과를 낳았습니다.java.time
Java 8(2014)에 내장된 패키지입니다.
한마디로 자바가 제대로 설계된 날짜/시간 API를 내장하는 데 18년이 걸렸지만 자바스크립트는 여전히 암흑기에 머물러 있다.LuxonMotent.js, date-fns, js-joda 등의 뛰어난 라이브러리를 갖추고 있습니다.하지만 현재로선, 이 모든 것이Date
언어에 짜넣어져 있습니다.TC39 Temporal 제안으로 가까운 장래에 이것이 바뀌기를 바랍니다.
프로그래밍 세계에서는 오래된(매우 불행한, 아마도 죽는) 전통입니다. 오래된 표준(POSIX) 현지 시간 C 함수를 참조하십시오.http://linux.die.net/man/3/localtime
날짜를 제외한 모든 것은 0을 기준으로 합니다.범위를 포함한 전체 목록은 여기를 참조하십시오.
사실 1일 동안 여기 이상한 것들이 많았어... 이상할 정도로 말이야.왜 그랬을까요?나도 몰라...아마 도배되어 세미콜론은 선택 사항으로 결정되었던 바로 그 미팅에서 일어났을 겁니다
2022년의 진짜 문제는 다음과 같습니다.
if
Date
JS 첫날부터 고장났는데, 왜 27년(0부터 계산하면 26년)이 지났는데도 여전히 여기에 있는 거죠?
JS에는 많은 불량 부품/요건이 있으며, 가장 나쁜 점은 그 중 일부가 수십 년 동안 수정되지 않았다는 것입니다(재미있는 사실: 지금 말씀드린 내용).Date
날짜)를 참조해 주세요.
이에요, '마지막'의 인 것 같아요.Date
까이있있 있있있다다
스포일러
new Temporal.PlainDate(2020, 11, 26); // => 2020-11-26
일시적(제안)
제안서 소개부터:
Date
ECMAScript 。이것은 에 대한 제안입니다.Temporal
, ""Object
: '네임스페이스')로 기능합니다.Math
ECMAScript API를 사용합니다.
문서에서 보고한 바와 같이 "조사한 일반적인 사용 사례"를 기반으로 하며 다양한 종류의 데이터에 대해 다음과 같은 여러 가지 유형이 있습니다.
Plain
.ZonedDateTime
.- 대부분의 유형에는 달력이 있습니다.
- 한 유형: " " " " "
Absolute
,DateTime
,Date
,Time
,TimeZone
, ...
가지 개요를 입니다.Temporal
유형 및 그 관계
자세한 내용은 이용 가능한 문서와 멋진 요리책을 참조하십시오.또는 미해결 이슈에 대한 최신 이슈를 살펴보십시오.
Temporal을 사용할 수 있는 경우
21년 3월부터 스테이지 3/초안 단계에 있습니다(TC39 스테이지 참조).21년 3월 TC39 슬라이드를 참조하십시오.
이제 정책이 다음과 같기 때문에 TypeScript에 곧 포함될 수 있습니다.
새로운 기능이 3단계에 도달하면 TypeScript에 포함될 준비가 됩니다.
아마 노드 및 주요 브라우저의 경우 더 기다려야 할 것입니다.
지금 바로 실험 시작
그 동안 Temporal polyfill(임시 폴리필)을 사용하여 실험할 수 있습니다.
npm install --save proposal-temporal
// temporal-test.js
const { Temporal } = require('proposal-temporal');
// or as an ES module
// import { Temporal } from 'proposal-temporal/lib/index.mjs';
// 11 means November now!
const date = new Temporal.PlainDate(2020, 11, 26); // => 2020-11-26
const sameDate = Temporal.PlainDate.from(
{year: 2020, month: 11, day: 26}); // => 2020-11-26
원래 질문에 대한 답변은 아니지만 이 문제에 대한 제가 선호하는 해결책을 보여드리고 싶었을 뿐입니다. 이 해답은 가끔 나타나기 때문에 결코 기억하지 못하는 것 같습니다.
작은 0을 채우는 하며, 그 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의 트위터를 읽었을 때 나는 웃고 있었다.
1년은 항상 12개월이기 때문에 초기 C 구현에서는 인덱스가 0.11인 정적 고정 폭 어레이를 사용했을 수 있습니다.
자바에서도 이런 식이에요.아마도 int를 문자열(0 - jan, 1 - feb)로 변환하기 위해 이 방식으로 코드화되었을 것입니다.월 이름(0부터 시작)과 월 번호의 배열이 있을 수 있기 때문에 0부터 시작하면 월 문자열에 매핑하는 것이 훨씬 쉬워집니다.
월을 열거형(첫 번째 인덱스는 0)으로 간주하고 이름이 연결되어 있지 않기 때문에 일수가 아닌 것으로 간주했을 수 있습니다.
또는 숫자를 변수로 사용하여 열거할 수 있지만 실제로는 0을 기준으로 하는 것처럼 날짜의 숫자가 실제 날짜의 표현이라고 생각했습니다(달과 같은 방식으로 달은 12/31과 같은 날짜의 숫자로 표현됩니다.
그래서 몇 달 동안 숫자 대신 달의 이름을 사용하는 것이 적절한 열거형 표현이라고 생각했을 수도 있습니다. 그리고 요일에 이름이 표시되었어도 똑같이 표현했을 것입니다.1월 5일, 1월 6일, 1월 5일, 1월 6일이라고 하면 아마 며칠 동안 0을 기준으로 계산했을지도 모릅니다.
아마도 그들은 잠재의식적으로 {1월, 2월, ...}과 같은 수개월 동안 열거에 대해 생각했을 것이다.}일 동안 {One, Two, Three, ...}일 동안 이름이 아닌 숫자로 액세스하는 날(예: 1 for One 등)을 제외하고 0에서 시작할 수 없습니다.
결점일 수도 있지만 ['''jan', 'feb'...etc'][new Date()][new Date(.get Month)][new Date('jan', 'feb'...etc'][new Date().get Month(etc)][new Date(new Date(')] 대신 [jan', '...]와 같은 배열을 만들면 편리합니다.
일반적으로 요일은 이름이 지정되지 않으므로 해당 요일의 이름을 사용하여 어레이를 만들 수 없습니다.이 경우 1-31이 다루기 쉬우므로 매번 1을 빼야 합니다.
간단한 솔루션 새로운 날짜(년, 월, 일) : -
let year = 2022
let month = 4
let day = 25
//use
new Date(year,month-1,day)
언급URL : https://stackoverflow.com/questions/2552483/why-does-the-month-argument-range-from-0-to-11-in-javascripts-date-constructor
'programing' 카테고리의 다른 글
Vue.js에서 @keyup 핸들러를 지연시키는 방법 (0) | 2023.01.02 |
---|---|
moment.js가 웹 팩으로 로케일을 로드하지 않도록 하는 방법 (0) | 2023.01.02 |
포스트 요청에서 JAX-RS 클라이언트의 응답 본문 읽기 (0) | 2023.01.02 |
Larabel 대기열 프로세스 시간 초과 오류 (0) | 2023.01.02 |
Python이 git bash 명령줄에서 작동하지 않음 (0) | 2023.01.02 |