Tại sao javascript này trả về 108 thay vì 2008? nó nhận được ngày và tháng chính xác nhưng không phải năm?
myDate = new Date();
year = myDate.getYear();
năm = 108?
year = myDate.getFullYear() % 100;
Tại sao javascript này trả về 108 thay vì 2008? nó nhận được ngày và tháng chính xác nhưng không phải năm?
myDate = new Date();
year = myDate.getYear();
năm = 108?
year = myDate.getFullYear() % 100;
Câu trả lời:
Đó là một điều Y2K , chỉ những năm kể từ năm 1900 mới được tính.
Có những vấn đề tiềm ẩn về khả năng tương thích hiện getYear()
đã không còn được ưu tiên getFullYear()
- từ quirksmode :
Để làm cho vấn đề phức tạp hơn, date.getYear () ngày nay không được dùng nữa và bạn nên sử dụng date.getFullYear (), do đó, không được các trình duyệt cũ hỗ trợ. Tuy nhiên, nếu nó hoạt động, nó phải luôn luôn cung cấp cho cả năm, tức là. 2000 thay vì 100.
Trình duyệt của bạn cung cấp các năm sau với hai phương pháp sau:
* The year according to getYear(): 108
* The year according to getFullYear(): 2008
Cũng có những khác biệt về triển khai giữa Internet Explorer và Firefox, vì việc triển khai IE của getYear()
đã được thay đổi để hoạt động giống như getFullYear()
- từ IBM :
Theo đặc tả ECMAScript, getYear trả về năm trừ 1900, ban đầu có nghĩa là trả về "98" cho 1998. getYear không được dùng nữa trong ECMAScript Phiên bản 3 và được thay thế bằng getFullYear ().
Internet Explorer đã thay đổi getYear () để hoạt động giống như getFullYear () và làm cho nó tuân thủ Y2k, trong khi Mozilla vẫn giữ nguyên hành vi tiêu chuẩn.
Vì getFullYear không hoạt động trong các trình duyệt cũ hơn, bạn có thể sử dụng một cái gì đó như sau:
Date.prototype.getRealYear = function()
{
if(this.getFullYear)
return this.getFullYear();
else
return this.getYear() + 1900;
};
Nguyên mẫu Javascript có thể được sử dụng để mở rộng các đối tượng hiện có, giống như các phương thức mở rộng C #. Bây giờ, chúng ta có thể làm điều này;
var myDate = new Date();
myDate.getRealYear();
// Outputs 2008
Kiểm tra tài liệu. Đó không phải là vấn đề Y2K - đó là thiếu vấn đề Y2K! Quyết định này ban đầu được đưa ra bằng C và được sao chép sang Perl, dường như là JavaScript, và có thể là một số ngôn ngữ khác. Từ lâu, người ta vẫn cảm thấy mong muốn sử dụng các năm hai chữ số, nhưng đáng chú ý là bất cứ ai thiết kế giao diện đó đều có đủ suy nghĩ để nhận ra rằng họ cần phải suy nghĩ về những gì sẽ xảy ra trong năm 2000 trở đi, vì vậy 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 đang vội 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 hoạt động, bạn có thể thêm 100 vào kết quả và sử dụng năm 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 tháng ở Perl. Thật kỳ lạ khi tôi đọc cá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 đến văn phòng vào ngày 31 tháng 12 năm 1999 để sửa một lỗi đã được phát hiện vào phút cuối có thể xảy ra trong một số mã Perl của hợp đồng, thứ mà tôi chưa bao giờ liên quan đến. Đó là vấn đề chính xác này: cuộc gọi ngày tiêu chuẩn trả về số năm kể từ năm 1900 và các lập trình viên coi nó như một 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 trẻ tuổi thiếu kinh nghiệm, tôi đã nghĩ 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í còn không thè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à yếm thế. :)
Vào năm 2000, hội nghị YAPC Perl hàng năm được gọi là "YAPC 19100" để vinh danh lỗi không được báo cáo này.
Ngày nay, ít nhất là trong thế giới Perl, sẽ hợp lý hơn khi sử dụng một mô-đun tiêu chuẩn để xử lý ngày tháng, một mô-đun sử dụng năm bốn chữ số thực. Không chắc những gì có thể có sẵn cho JavaScript.
Nó phải trả về số năm kể từ năm 1900.
sử dụng date.getFullYear()
.
Đây là (như đã chỉ ra một cách chính xác ở những nơi khác) là một điều Y2K. Netscape (được viết trước năm 2000) ban đầu trả lại, ví dụ 98
từ getYear()
. Thay vì quay trở lại 00
, nó đã quay trở lại 100
vào năm 2000. Sau đó, các trình duyệt khác ra đời và làm điều đó theo cách khác, và mọi người đều không hài lòng vì tính không tương thích ngự trị.
Các trình duyệt sau này được hỗ trợ getFullYear
như một phương pháp tiêu chuẩn để trả về năm hoàn chỉnh.
Câu hỏi này cũ đến mức khiến tôi rơi nước mắt vì 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ư localtime () 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 lại không chiếm doanh thu thế kỷ, nhưng tôi có thể nói gì? Bạn đã phải có mặt ở đó. Nó có ý nghĩa vào thời điểm đó (giống như Pet.com đã làm).
Trước năm 2000, người ta có thể đã muốn sửa lỗi này bằng cách thêm "19" vào kết quả của getYear () dẫn đến "lỗi năm 19100" . 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ó lẽ cuốn sách bạn đang đọc về JavaScript hơi cũ?
Cảm ơn vì vụ nổ từ quá khứ!
Bạn nên, như đã chỉ ra, không bao giờ sử dụng getYear()
, mà hãy sử dụng getFullYear()
.
Tuy nhiên, câu chuyện không đơn giản như "IE triển khai GetYear()
như getFullYear()
. Opera và IE ngày nay coi getYear()
như getYear()
được chỉ định ban đầu cho các ngày trước năm 2000, nhưng sẽ coi nó như getFullYear()
cho các ngày sau năm 2000, trong khi webkit và Firefox vẫn giữ nguyên trạng thái cũ
Kết quả này xuất ra 99 trong tất cả các trình duyệt:
javascript:alert(new Date(917823600000).getYear());
Kết quả này xuất ra 108 trong FF / WebKit và 2008 trong Opera / IE:
javascript:alert(new Date().getYear());
Thật ngu ngốc. Nó có từ trước Y2K ngày và bây giờ chỉ trả về số năm kể từ năm 1900 vì những lý do cũ. Sử dụng getFullYear () để lấy năm thực tế.
Con số bạn nhận được là số năm kể từ năm 1900. Đừng hỏi tôi tại sao ..
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ó làm được điều đó là khi JavaScript được phát minh vào giữa những năm 90, hành vi đó vừa thuận tiện vừa phù hợp với các API ngày-giờ ở các ngôn ngữ khác. Đặc biệt C. Và, tất nhiên, khi API được thiết lập, họ không thể thay đổi nó vì lý do tương thích ngược.
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 bạn nên bỏ qua chức năng này hoàn toàn và sử dụng getFullYear () luôn.
var date_object = new Date (); var year = date_object.getYear (); if (năm <2000) {year = year + 1900; } // u sẽ nhận được đầy đủ năm ....
nó đang trả về năm 4 chữ số - 1900, có thể đã rất tuyệt vời hơn 9 năm trước, nhưng hiện tại đã khá chậm phát triển. Java của java.util.Date cũng làm được điều này.