2008-09-18 31 views
82

Tại sao javascript này trả lại 108 thay vì năm 2008? nó được ngày và tháng chính xác nhưng không phải là năm?Tại sao Javascript getYear() trả về 108?

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

năm = 108?

+24

Ồ, những tội lỗi chúng tôi đã cố gắng vượt qua Y2K. – DGentry

+2

'year = myDate.getFullYear()% 100;' –

Trả lời

113

Đó là một điều Y2K, chỉ những năm kể từ năm 1900 được tính.

Có vấn đề tương thích tiềm năng bây giờ mà getYear() đã phản đối ủng hộ getFullYear() - từ quirksmode:

Để thực hiện các vấn đề thậm chí phức tạp hơn, date.getYear() là phản đối ngày nay và bạn nên sử dụng ngày .getFullYear(), lần lượt, không được các trình duyệt cũ hỗ trợ. Nếu nó hoạt động, tuy nhiên, nó luôn luôn nên cung cấp cho cả năm, tức là. 2000 thay vì 100.

Trình duyệt của bạn mang đến cho những năm tiếp theo với hai phương pháp:

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

Ngoài ra còn có sự khác biệt thực hiện giữa Internet Explorer và Firefox, như thực hiện getYear() của IE đã được thay đổi để hành xử như getFullYear() - từ IBM:

Theo đặc điểm kỹ thuật ECMAScript, getYear trả về năm trừ 1900, ban đầu có nghĩa là trả lại "98" cho năm 1998. ge tYear không được chấp nhận trong ECMAScript Phiên bản 3 và được thay thế bằng getFullYear().

Internet Explorer thay đổi getYear() để làm việc như getFullYear() và làm cho nó tuân thủ Y2k, trong khi Mozilla giữ nguyên hành vi tiêu chuẩn.

6

Nó phải trả lại số năm kể từ năm 1900.

0

Số bạn nhận được là số năm kể từ 1900. Đừng hỏi tôi tại sao ..

3

sử dụng date.getFullYear().

Đây là (được chỉ ra chính xác ở nơi khác) là điều Y2K. Netscape (viết trước năm 2000) ban đầu được trả về, ví dụ: 98 từ getYear(). Thay vì quay trở lại 00, thay vào đó nó quay trở lại 100 cho năm 2000. Sau đó, các trình duyệt khác xuất hiện và thực hiện theo cách khác, và mọi người đều không hài lòng vì sự không tương thích được trị vì.

Trình duyệt sau hỗ trợ getFullYear làm phương pháp chuẩn để trả về năm hoàn chỉnh.

0

nó quay trở lại 4 chữ số năm - 1900, có thể đã được làm mát từ 9 năm trước, nhưng hiện đang chậm phát triển. Java.util.Date của Java cũng làm điều này.

1

Thật ngu ngốc. Nó dates to pre-Y2K days và giờ chỉ trả về số năm kể từ năm 1900 vì lý do cũ. Sử dụng getFullYear() để có được năm thực tế.

0

Như những người khác đã nói, nó trả về số năm kể từ năm 1900. Lý do tại sao nó rằng là khi JavaScript được phát minh vào giữa những năm 90, hành vi đó vừa tiện lợi vừa phù hợp với API thời gian bằng các ngôn ngữ khác. Đặc biệt C. Và, tất nhiên, một khi API được thiết lập, họ không thể thay đổi nó vì lý do tương thích ngược.

0

BTW, các trình duyệt khác nhau có thể trả về các kết quả khác nhau, vì vậy tốt hơn hết nên bỏ qua chức năng này và luôn sử dụng getFullYear().

23

Kể từ khi getFullYear không làm việc trong các trình duyệt cũ hơn, bạn có thể sử dụng một cái gì đó như thế này:

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

Javascript nguyên mẫu có thể được sử dụng để mở rộng đối tượng hiện có, giống như phương pháp # mở rộng C. Bây giờ, chúng ta chỉ có thể làm điều này;

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

Có thể smth như Date.prototype.getRealYear = Date.prototype.getFullYear? Date.prototype.getFullYear: function() { trả về this.getYear() + 1900; }; –

1

Câu hỏi này quá cũ khiến tôi cảm thấy hoài niệm về những ngày dotcom!

Đúng vậy, Date.getYear() trả về số năm kể từ năm 1900, giống như giờ địa phương của Perl(). Người ta tự hỏi tại sao một ngôn ngữ được thiết kế vào những năm 1990 sẽ không tính đến doanh thu của thế kỷ, nhưng tôi có thể nói gì? Bạn đã phải có mặt ở đó. Nó đã tạo ra một loại cảm giác vào thời điểm đó (như pets.com đã làm).

Trước năm 2000, người ta có thể đã bị cám dỗ để khắc phục lỗi này bằng cách thêm "19" vào kết quả của getYear() dẫn đến "year 19100 bug". Những người khác đã trả lời câu hỏi này đầy đủ (thêm 1900 vào kết quả của getDate()).

Có thể cuốn sách bạn đang đọc về JavaScript hơi cũ?

Cảm ơn vì sự bùng nổ từ quá khứ!

+0

Lý do ngôn ngữ (Perl) không giải thích vì nó đã sao chép một cách mù quáng một quyết định thiết kế C đã được thực hiện trước đó. (20 năm?) – skiphoppy

9

Kiểm tra tài liệu. Nó không phải là một vấn đề Y2K - đó là một vấn đề thiếu Y2K! Quyết định này được đưa ra ban đầu trong C và được sao chép vào Perl, rõ ràng là JavaScript, và có lẽ một số ngôn ngữ khác. Cách đây từ lâu, dường như vẫn cảm thấy mong muốn sử dụng hai năm, nhưng đáng chú ý là bất cứ ai thiết kế giao diện đó đều đủ để nhận ra họ cần suy nghĩ về những gì sẽ xảy ra trong năm 2000 và hơn thế nữa, thay vì chỉ cung cấp hai chữ số, họ cung cấp số năm kể từ năm 1900. Bạn có thể sử dụng hai chữ số, nếu bạn vội vàng hoặc muốn mạo hiểm. Hoặc nếu bạn muốn chương trình của mình tiếp tục làm việc, bạn có thể thêm 100 vào kết quả và sử dụng năm có bốn chữ số chính thức.

Tôi nhớ lần đầu tiên tôi thực hiện thao tác ngày trong Perl. Thật kỳ lạ, tôi đọc tài liệu. Rõ ràng đây không phải là một điều phổ biến. Một hoặc hai năm sau, tôi được gọi vào văn phòng vào ngày 31 tháng 12 năm 1999 để sửa chữa một lỗi đã được phát hiện vào phút cuối cùng trong một số mã Perl hợp đồng, những thứ tôi chưa bao giờ làm gì cả. Đó là vấn đề chính xác này: cuộc gọi ngày tiêu chuẩn đã trở lại nhiều năm kể từ năm 1900 và các lập trình viên coi đó là năm có hai chữ số. (Họ cho rằng họ sẽ nhận được "00" vào năm 2000.) Là một lập trình viên thiếu kinh nghiệm trẻ, nó thổi tâm trí của tôi rằng chúng tôi đã trả quá nhiều tiền cho một công việc "chuyên nghiệp", và những người đó thậm chí không bận tâm để đọc tài liệu. Đó là sự khởi đầu của nhiều năm vỡ mộng; bây giờ tôi già và hoài nghi. :)

Vào năm 2000, hội nghị YAPC Perl hàng năm được gọi là "YAPC 19100" để tôn trọng lỗi không được báo cáo này.

Ngày nay, trong thế giới Perl ít nhất, nó có ý nghĩa hơn khi sử dụng mô-đun chuẩn để xử lý ngày, một mô-đun sử dụng năm có bốn chữ số thực. Không chắc chắn những gì có thể có sẵn cho JavaScript.

+0

hehe ... nhắc tôi về phim hoạt hình Dilbert ... "bạn đã đọc câu chuyện về một anh chàng người Tây Ban Nha tên là Manual chưa?" ;) –

2

Bạn nên, như được chỉ ra, không bao giờ sử dụng getYear(), nhưng thay vào đó hãy sử dụng getFullYear().

Câu chuyện là tuy nhiên không đơn giản như "IE thực hiện GetYear() như getFullYear(). Opera và IE những ngày điều trị getYear() như getYear() ban đầu đã được chỉ định cho những ngày trước năm 2000, nhưng sẽ đối xử với nó như getFullYear() cho những ngày sau năm 2000, trong khi webkit và Firefox dính với các hành vi cũ

này kết quả đầu ra 99 trong tất cả các trình duyệt:

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

này kết quả đầu ra 108 trong FF/WebKit, và 2008 trong Opera/IE:

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

var date_object = new Date(); var year = date_object.getYear(); nếu (năm < 2000) { năm = năm + 1900; } // u sẽ nhận trọn năm ....

1

Tôi đang sử dụng date.getUTCFullYear(); không hoạt động.

Các vấn đề liên quan