Javascript getYear ()가 108을 반환하는 이유는 무엇입니까?


95

이 자바 스크립트가 2008 대신 108을 반환하는 이유는 무엇입니까? 날짜와 월은 정확하지만 연도는 맞지 않습니까?

myDate = new Date();
year = myDate.getYear();

연도 = 108?


29
오, 우리가 Y2K를 통과하려고 저지른 죄.
DGentry

3
year = myDate.getFullYear() % 100;
Andrew Larsson 2012

답변:


128

그것은 Y2K 일이며 1900 년 이후로만 계산됩니다.

이제 잠재적 인 호환성 문제는 getYear()찬성 사용되지 않습니다 getFullYear()-에서 쿼크 모드는 :

문제를 더 복잡하게 만들기 위해 date.getYear ()는 현재 더 이상 사용되지 않으며 date.getFullYear ()를 사용해야하며 이는 이전 브라우저에서 지원되지 않습니다. 그러나 작동한다면 항상 1 년을 제공해야합니다. 100 대신 2000.

브라우저는 다음 두 가지 방법으로 다음 해를 제공합니다.

* The year according to getYear(): 108
* The year according to getFullYear(): 2008

의 IE의 구현으로 인터넷 익스플로러와 파이어 폭스 간의 구현 차이도있다 getYear()변경되었습니다처럼 행동 getFullYear()-에서 IBM :

ECMAScript 사양에 따라 getYear는 1900 년을 뺀 연도를 반환하며 원래는 1998 년에 "98"을 반환하는 것을 의미했습니다. getYear는 ECMAScript 버전 3에서 더 이상 사용되지 않으며 getFullYear ()로 대체되었습니다.

Internet Explorer는 getYear ()를 getFullYear ()처럼 작동하고 Y2k를 준수하도록 변경했으며 Mozilla는 표준 동작을 유지했습니다.


25

getFullYear는 이전 브라우저에서 작동하지 않으므로 다음과 같이 사용할 수 있습니다.

Date.prototype.getRealYear = function() 
{ 
    if(this.getFullYear)
        return this.getFullYear();
    else
        return this.getYear() + 1900; 
};

자바 스크립트 프로토 타입은 C # 확장 메서드와 마찬가지로 기존 개체를 확장하는 데 사용할 수 있습니다. 이제 우리는 이것을 할 수 있습니다.

var myDate = new Date();
myDate.getRealYear();
// Outputs 2008

7
아마도 Date.prototype.getRealYear = Date.prototype.getFullYear? Date.prototype.getFullYear : function () {return this.getYear () + 1900; };
Valentin Golev

12

문서를 확인하십시오. Y2K 문제가 아니라 Y2K 문제가 없습니다! 이 결정은 원래 C로 이루어졌으며 Perl, JavaScript 및 기타 여러 언어로 복사되었습니다. 오래 전에는 두 자리 연도를 사용하는 것이 여전히 바람직하다고 느꼈지만, 그 인터페이스를 설계 한 사람은 누구나 2000 년 이후에 일어날 일에 대해 생각할 필요가 있다는 것을 인식 할만큼 충분히 미리 생각 했으므로 마지막 두 자리를 제공하는 대신 숫자, 그들은 1900 년 이후의 연수를 제공했습니다. 급하거나 위험하기를 원한다면 두 숫자를 사용할 수 있습니다. 또는 프로그램이 계속 작동하도록하려면 결과에 100을 더하고 본격적인 4 자리 연도를 사용할 수 있습니다.

Perl에서 처음으로 날짜 조작을했던 때를 기억합니다. 이상하게도 나는 문서를 읽었다 . 분명히 이것은 흔한 일이 아닙니다. 1 ~ 2 년 후 저는 1999 년 12 월 31 일 사무실로 전화를 걸어서 계약 펄 코드에서 마지막 순간에 발견 된 버그를 수정했습니다. 바로이 문제였습니다. 표준 날짜 호출은 1900 년 이후로 연도를 반환했으며 프로그래머는이를 두 자리 연도로 취급했습니다. (그들은 2000 년에 "00"을받을 것이라고 생각했습니다.) 경험이없는 젊은 프로그래머로서 "전문적인"직업에 너무 많은 추가 비용을 지불했고 그 사람들은이 책을 읽는 것도 귀찮게 생각하지 않았습니다. 선적 서류 비치. 그것은 수년간의 환멸의 시작이었습니다. 이제 나는 늙고 냉소적입니다. :)

2000 년에, 연례 YAPC Perl 컨퍼런스는 자주보고되는이 버그가 아닌 것을 기리기 위해 "YAPC 19100"이라고 불 렸습니다.

요즘에는 적어도 Perl 세계에서는 실제 4 자리 연도를 사용하는 날짜 처리를 위해 표준 모듈을 사용하는 것이 더 합리적입니다. JavaScript에서 사용할 수있는 항목이 확실하지 않습니다.


1
헤헤 ... 딜버트 만화가 생각 나네요 ... "매뉴얼이라는 스페인 남자에 대한 이야기를 읽어 보셨나요?" ;)
Adhip Gupta

@skiphoppy는 getYear ()에 1900을 추가하면 원하는 전체 연도를 생성 할 수 있음을 의미한다고 생각합니다. 사람이 읽을 수있는 월 수를 검색 할 때 getMonth ()에 +1을 추가하는 것과 비슷합니다. 예 : var ts = new Date (); var fullYear = (ts.getYear () + 1900); 그러나 getFullYear ()를 사용하는 것이 좋습니다. 예 : var fullYear = new Date (). getFullYear ();
재귀


4

사용하다 date.getFullYear() .

이것은 (다른 곳에서 올바르게 지적했듯이) Y2K 일입니다. 넷스케이프는 (2000 년 이전에 작성된)는 원래 예를 들어, 반환 98에서 getYear(). 돌아 가기보다는00 않고 대신 1002000 년에 돌아 왔습니다 . 그런 다음 다른 브라우저가 등장하여 다른 방식으로 작업을 수행했으며 비 호환성이 지배함에 따라 모든 사람이 불만족 스러웠습니다.

이후 브라우저 getFullYear는 전체 연도를 반환하는 표준 방법으로 지원 됩니다.


3

이 질문은 너무 오래되어 닷컴 시대에 대한 향수로 울게 만듭니다!

맞습니다. Date.getYear ()는 Perl의 localtime ()과 마찬가지로 1900 년 이후의 년 수를 반환합니다. 1990 년대에 디자인 된 언어가 세기의 매출을 설명하지 못하는 이유가 궁금합니다.하지만 제가 무엇을 말할 수 있습니까? 당신은 거기에 있어야했습니다. 당시에는 일종의 의미가있었습니다 (예 : pets.com).

2000 년 이전에는 getYear () 결과에 "19"를 추가하여 " 19100 년 버그"를 생성하여이 버그를 수정하려는 유혹을 받았을 수 있습니다. . 다른 사람들은 이미이 질문에 충분히 대답했습니다 (getDate ()의 결과에 1900을 추가).

자바 스크립트에 대해 읽고있는 책이 조금 오래 되었나요?

과거의 폭발에 감사드립니다!


언어 (Perl)가이를 설명하지 않은 이유는 훨씬 이전에 내린 C 디자인 결정을 맹목적으로 복사했기 때문입니다. (20 년?)
skiphoppy

나는 Perl이 아니라 JavaScript에 그늘을 던지고 있었다. Perl은 종종 기본 C 루틴을 오히려 직접 노출합니다. 당신이 말했듯이 그것은 그 시대의 산물입니다. 적어도 10 년 후에 디자인 된 JS는 다른 길을 갔을 수도 있습니다.
jjohn

2

지적했듯이을 사용 getYear()하지 말고 대신getFullYear() .

이야기는 IE 구현 "단순하게 그러나 아닙니다 GetYear()으로 getFullYear()취급하여 요즘. 오페라와 IE getYear()와 같은 getYear()원래 2000 년 이전 날짜를 지정 되었으나로 취급 getFullYear()하면서, 2000 년 이후 날짜 이전 동작과 웹킷과 파이어 폭스 스틱

이것은 모든 브라우저에서 99를 출력합니다.

javascript:alert(new Date(917823600000).getYear());

이것은 FF / WebKit에서 108을 출력하고 Opera / IE에서 2008을 출력합니다.

javascript:alert(new Date().getYear());


1

나는 사용하고있다 date.getUTCFullYear(); 문제없이 작동합니다.


0

당신이 얻은 숫자는 1900 년 이후의 연수입니다. 이유는 묻지 마십시오.


0

다른 사람이 말했듯이, 그것은 1900는 않습니다 이유 때문에 년간의 수를 반환 즉, 자바 스크립트가 90 년대 중반에 발명되었을 때, 그 행동이 편리하고 다른 언어 날짜 - 시간의 API와 일치하는 두라고합니다. 특히 C. 그리고 물론 API가 설정되면 이전 버전과의 호환성을 이유로 변경할 수 없었습니다.


0

BTW, 다른 브라우저는 다른 결과를 반환 할 수 있으므로이 함수를 모두 건너 뛰고 항상 getFullYear ()를 사용하는 것이 좋습니다.


0

var date_object = new Date (); var year = date_object.getYear (); if (연도 <2000) {연도 = 연도 + 1900; } // u는 1 년을받을 것입니다 ....


-1

4 자리 연도-1900 년을 반환합니다. 9 년 이상 전에는 멋 졌을 지 모르지만 지금은 상당히 느립니다. Java의 java.util.Date도이 작업을 수행합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.