문제

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

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

연도 = 108?

도움이 되었습니까?

해결책

그것은 Y2K 즉, 1900년 이후의 연도만 계산됩니다.

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

문제를 더욱 복잡하게 만들기 위해 date.getYear()는 요즘 더 이상 사용되지 않으며 date.getFullYear()를 사용해야 합니다. 이는 이전 브라우저에서 지원되지 않습니다.그러나 이것이 작동한다면 항상 전체 연도를 제공해야 합니다.100이 아니라 2000입니다.

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

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

Internet Explorer와 Firefox 사이에는 구현상의 차이점도 있습니다. IE의 구현은 다음과 같습니다. getYear() 다음과 같이 동작하도록 변경되었습니다. getFullYear() - 에서 IBM:

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

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

다른 팁

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

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

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

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

문서를 확인하세요.Y2K 문제가 아닙니다. Y2K 문제가 부족합니다!이 결정은 원래 C에서 이루어졌고 Perl, JavaScript 및 기타 여러 언어로 복사되었습니다.오래 전에는 여전히 두 자리 연도를 사용하는 것이 바람직하다고 생각되었지만 놀랍게도 해당 인터페이스를 설계한 사람은 2000년과 그 이후에 무슨 일이 일어날지 생각해야 한다는 것을 깨닫기에 충분한 사전 고려를 갖고 있었습니다. 숫자로 1900년 이후의 연수를 제공했습니다.서두르거나 위험을 감수하고 싶다면 두 자리 숫자를 사용할 수 있습니다.또는 프로그램이 계속 작동하도록 하려면 결과에 100을 추가하고 완전한 4자리 연도를 사용할 수 있습니다.

나는 Perl에서 처음으로 날짜 조작을 했을 때를 기억합니다.이상하게도 난 문서를 읽어보세요.분명히 이것은 일반적인 일이 아닙니다.1~2년 후 나는 일부 계약 Perl 코드에서 가능한 마지막 순간에 발견된 버그를 수정하기 위해 1999년 12월 31일 사무실에 호출받았습니다. 버그는 나와 전혀 관련이 없었습니다.정확한 문제는 다음과 같습니다.표준 날짜 호출은 1900년 이후의 연도를 반환했으며 프로그래머는 이를 두 자리 연도로 처리했습니다.(그들은 2000년에 "00"을 받을 것이라고 가정했습니다.) 경험이 부족한 젊은 프로그래머로서 우리가 "전문적인" 직업을 위해 너무 많은 추가 비용을 지불했다는 사실에 마음이 아팠습니다. 선적 서류 비치.그것은 수년간의 환멸의 시작이었습니다.이제 나는 늙고 냉소적이다.:)

2000년에 연례 YAPC Perl 컨퍼런스는 자주 보고되는 버그가 아닌 이 문제를 기리기 위해 "YAPC 19100"으로 불렸습니다.

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

1900년 이후의 연도 수를 반환해야 합니다.

사용 date.getFullYear().

이것은 (다른 곳에서 올바르게 지적했듯이) Y2K입니다.예를 들어 Netscape(2000년 이전에 작성됨)는 원래 반환되었습니다. 98 ~에서 getYear().다시 돌아오는 것보다 00, 대신 반환되었습니다. 100 2000년 동안.그러다가 다른 브라우저가 등장하여 다르게 작동했고 비호환성으로 인해 모두가 불만을 느꼈습니다.

최신 브라우저 지원 getFullYear 전체 연도를 반환하는 표준 방법입니다.

이 질문은 너무 오래되어서 닷컴 시절에 대한 향수에 젖어 눈물을 흘리게 만듭니다!

맞습니다. Date.getYear()는 Perl의 localtime()과 마찬가지로 1900년 이후의 연도 수를 반환합니다.1990년대에 설계된 언어가 왜 세기의 변화를 설명하지 못하는지 궁금합니다. 하지만 뭐라고 말할 수 있을까요?당신은 거기에 있어야했습니다.당시에는 일종의 의미가 있었습니다(pets.com이 그랬던 것처럼).

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

어쩌면 당신이 읽고 있는 JavaScript에 관한 책이 조금 오래된 책일까요?

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

지적한 대로 절대 사용해서는 안 됩니다. getYear(), 대신에 getFullYear().

그러나 이야기는 "IE가 구현하는 것"만큼 간단하지 않습니다. GetYear() ~처럼 getFullYear().요즘 Opera와 IE는 getYear() ~처럼 getYear() 원래 2000년 이전 날짜로 지정되었지만 다음과 같이 처리됩니다. getFullYear() 2000년 이후의 경우 웹킷과 Firefox는 이전 동작을 고수합니다.

모든 브라우저에서 99가 출력됩니다.

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

FF/WebKit에서는 108이 출력되고 Opera/IE에서는 2008이 출력됩니다.

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

그것은 바보입니다.그것 Y2K 이전 날짜까지의 날짜, 이제 레거시 이유로 인해 1900년 이후 연도 수를 반환합니다.실제 연도를 얻으려면 getFullYear()를 사용하십시오.

나는 사용하고있다 date.getUTCFullYear();문제없이 일하고 있습니다.

당신이 얻는 숫자는 1900년 이후의 연수입니다.이유는 묻지 마세요..

다른 사람들이 말했듯이 1900년 이후의 연도 수를 반환합니다.그렇게 되는 이유 저것 90년대 중반에 JavaScript가 발명되었을 때 그 동작은 편리하고 다른 언어의 날짜-시간 API와 일관성이 있었습니다.특히 C.물론 API가 일단 확립되면 이전 버전과의 호환성 때문에 API를 변경할 수 없습니다.

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

var date_object=new Date();var year = date_object.getYear();if (년 <2000) {년 = 년 + 1900;} // u는 일년 내내 얻을 것입니다 ....

4자리 연도인 1900을 반환합니다. 9년 이상 전에는 괜찮았지만 지금은 상당히 뒤쳐졌습니다.Java의 java.util.Date도 이를 수행합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top