เหตุใดจาวาสคริปต์นี้จึงส่งคืน 108 แทนปี 2008 มันทำให้วันและเดือนถูกต้อง แต่ไม่ใช่ปี?
myDate = new Date();
year = myDate.getYear();
ปี = 108?
เหตุใดจาวาสคริปต์นี้จึงส่งคืน 108 แทนปี 2008 มันทำให้วันและเดือนถูกต้อง แต่ไม่ใช่ปี?
myDate = new Date();
year = myDate.getYear();
ปี = 108?
year = myDate.getFullYear() % 100;
คำตอบ:
มันเป็นสิ่งที่Y2Kนับเฉพาะปีตั้งแต่ปี 1900 เท่านั้น
ขณะนี้มีปัญหาความเข้ากันได้ที่อาจgetYear()
ได้รับการเลิกใช้งานgetFullYear()
- from quirksmode :
เพื่อให้เรื่องซับซ้อนยิ่งขึ้น date.getYear () เลิกใช้แล้วในปัจจุบันและคุณควรใช้ date.getFullYear () ซึ่งในทางกลับกันเบราว์เซอร์รุ่นเก่าไม่รองรับ อย่างไรก็ตามหากใช้งานได้ก็ควรให้ทั้งปีเสมอเช่น 2000 แทนที่จะเป็น 100
เบราว์เซอร์ของคุณให้เวลาสองปีต่อไปนี้:
* The year according to getYear(): 108
* The year according to getFullYear(): 2008
นอกจากนี้ยังมีความแตกต่างของการนำไปใช้งานระหว่าง Internet Explorer และ Firefox เนื่องจากการใช้งานของ IE getYear()
ถูกเปลี่ยนให้ทำงานเหมือนgetFullYear()
- จากIBM :
ตามข้อกำหนด ECMAScript getYear ส่งคืนปีลบ 1900 เดิมหมายถึงส่งคืน "98" สำหรับปี 1998 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 ในผลลัพธ์และใช้ตัวเลขสี่หลักปีเต็ม
ฉันจำได้ว่าครั้งแรกที่ฉันเดทกับ Perl แปลกพอฉันอ่านเอกสาร เห็นได้ชัดว่านี่ไม่ใช่เรื่องธรรมดา หนึ่งหรือสองปีต่อมาฉันถูกเรียกตัวไปที่สำนักงานในวันที่ 31 ธันวาคม 2542 เพื่อแก้ไขข้อบกพร่องที่ถูกค้นพบในนาทีสุดท้ายที่เป็นไปได้ในรหัส Perl ของสัญญาซึ่งเป็นสิ่งที่ฉันไม่เคยเกี่ยวข้องกับมันเลย นี่คือปัญหาที่แน่นอน: การโทรวันที่มาตรฐานส่งคืนปีตั้งแต่ปี 1900 และโปรแกรมเมอร์ถือว่าเป็นปีสองหลัก (พวกเขาคิดว่าพวกเขาจะได้รับ "00" ในปี 2000) ในฐานะโปรแกรมเมอร์อายุน้อยที่ไม่มีประสบการณ์มันทำให้ฉันคิดว่าเราต้องจ่ายเงินเพิ่มมากสำหรับงาน "มืออาชีพ" และคนเหล่านั้นก็ไม่สนใจที่จะอ่าน เอกสารประกอบ. มันเป็นจุดเริ่มต้นของความท้อแท้มาหลายปี ตอนนี้ฉันแก่แล้วและถูกเหยียดหยาม :)
ในปี 2000 การประชุม YAPC Perl ประจำปีถูกเรียกว่า "YAPC 19100" เพื่อเป็นเกียรติแก่การไม่พบข้อผิดพลาดนี้
ในปัจจุบันอย่างน้อยที่สุดในโลก Perl ก็มีเหตุผลมากกว่าที่จะใช้โมดูลมาตรฐานสำหรับการจัดการวันที่ซึ่งใช้ปีตัวเลขสี่หลักจริง ไม่แน่ใจว่ามีอะไรบ้างสำหรับ JavaScript
ต้องส่งคืนจำนวนปีตั้งแต่ปี 1900
ใช้date.getFullYear()
.
นี่คือ (ตามที่ระบุไว้อย่างถูกต้องที่อื่น) เป็นสิ่งที่ Y2K Netscape (เขียนก่อนปี 2000) ส่งคืนครั้งแรกเช่น98
จากgetYear()
. แทนที่จะกลับไปใช้00
มันกลับมา100
ในปี 2000 แทนจากนั้นเบราว์เซอร์อื่น ๆ ก็เข้ามาและทำมันแตกต่างกันไปและทุกคนก็ไม่พอใจเพราะความไม่ลงรอยกัน
เบราว์เซอร์รุ่นหลังได้รับการสนับสนุนgetFullYear
เป็นวิธีมาตรฐานในการส่งคืนปีที่สมบูรณ์
คำถามนี้เก่ามากจนทำให้ฉันร้องไห้ด้วยความคิดถึงวันดอทคอม!
ถูกต้อง Date.getYear () ส่งคืนจำนวนปีตั้งแต่ปี 1900 เช่นเดียวกับ Localtime ของ Perl () มีสิ่งหนึ่งที่น่าแปลกใจว่าทำไมภาษาที่ออกแบบในปี 1990 จึงไม่นับว่ามีการหมุนเวียนในศตวรรษนี้ แต่ฉันจะพูดอะไรได้ คุณต้องอยู่ที่นั่น มันเป็นเรื่องที่สมเหตุสมผลในเวลานั้น (เช่นที่ pet.com ทำ)
ก่อนปี 2000 หนึ่งอาจได้รับการล่อลวงเพื่อแก้ไขปัญหานี้โดยการผนวก "19" ถึงผลของการ getYear (The) ส่งผลให้"ปี 19100 ข้อผิดพลาด" มีคนอื่นตอบคำถามนี้เพียงพอแล้ว (เพิ่ม 1900 ในผลลัพธ์ของ getDate ())
บางทีหนังสือที่คุณกำลังอ่านเกี่ยวกับ JavaScript อาจจะเก่าไปหน่อย?
ขอบคุณสำหรับการระเบิดในอดีต!
คุณควรตามที่ระบุไว้ห้ามgetYear()
ใช้ แต่ใช้แทนgetFullYear()
อย่างไรก็ตามเรื่องนี้ไม่ง่ายอย่างที่ "IE ใช้GetYear()
เช่นเดียวกับgetFullYear()
Opera และ IE ในปัจจุบันgetYear()
ตามที่getYear()
ระบุไว้เดิมสำหรับวันที่ก่อนปี 2000 แต่จะถือว่าเป็นgetFullYear()
วันที่หลังปี 2000 ในขณะที่ webkit และ Firefox ยึดติดกับพฤติกรรมเดิม ๆ
สิ่งนี้ส่งผล 99 ในเบราว์เซอร์ทั้งหมด:
javascript:alert(new Date(917823600000).getYear());
เอาต์พุต 108 ใน FF / WebKit และ 2008 ใน Opera / IE:
javascript:alert(new Date().getYear());
มันเป็นใบ้ มันเพื่อวัน Y2K ก่อนและตอนนี้เพียงแค่ส่งกลับจำนวนของปีที่ผ่านมาตั้งแต่ปี 1900 ด้วยเหตุผลมรดก ใช้ getFullYear () เพื่อรับปีจริง
ฉันใช้date.getUTCFullYear()
; ทำงานได้โดยไม่มีปัญหา
เลขที่คุณได้คือเลขของปี 1900 อย่าถามฉันว่าทำไม ..
ตามที่คนอื่น ๆ กล่าวไว้มันจะคืนค่าจำนวนปีตั้งแต่ปี 1900 เหตุผลที่เป็นเช่นนั้นก็คือเมื่อ JavaScript ถูกประดิษฐ์ขึ้นในช่วงกลางทศวรรษที่ 90 พฤติกรรมนั้นทั้งสะดวกและสอดคล้องกับ API วันที่ - เวลาในภาษาอื่น ๆ โดยเฉพาะอย่างยิ่ง C. และแน่นอนว่าเมื่อสร้าง API แล้วจะไม่สามารถเปลี่ยนแปลงได้ด้วยเหตุผลด้านความเข้ากันได้ย้อนหลัง
BTW เบราว์เซอร์ที่แตกต่างกันอาจให้ผลลัพธ์ที่แตกต่างกันดังนั้นจึงเป็นการดีกว่าที่จะข้ามฟังก์ชันนี้ไปพร้อมกันและใช้ getFullYear () เสมอ
var date_object = วันที่ใหม่ (); var ปี = date_object.getYear (); ถ้า (ปี <2000) {ปี = ปี + 1900; } // จะได้ครบปี ....
กำลังส่งคืนตัวเลข 4 หลักในปี 1900 ซึ่งอาจจะดูดีเมื่อ 9+ ปีที่แล้ว แต่ตอนนี้ค่อนข้างปัญญาอ่อน java.util.Date ของ Java ก็ทำเช่นนี้เช่นกัน