為什麼一些政府網站上顯示今年是 19113 年?
比如進入信訪辦的官網,上面的日期顯示的是今天是19113年7月1日。怎麼回事?
Chrome:
FireFox:為什麼會這樣? (以下都可以在 Chrome F12 、 Console中看到對應的結果。)
首先,我們在瀏覽器中獲取時間一般會用到
new Date()
這是能夠獲得正確時間的,
但是,這不是我們需要的樣式,所以,會將這年月日等,用不同的方法提取出來。
如下鏈接有列表JavaScript Date Object一般情況下我們會使用 getFullYear() 來獲取年份,因為 getYear() 取值太麻煩。
Date.getYearThe getYear method returns the year minus 1900; thus:
- For years greater than or equal to 2000, the value returned by getYear is 100 or greater. For example, if the year is 2026, getYear returns 126.
- For years between and including 1900 and 1999, the value returned by getYear is between 0 and 99. For example, if the year is 1976, getYear returns 76.
- For years less than 1900, the value returned by getYear is less than 0. For example, if the year is 1800, getYear returns -100.
但是,我們看看某政府網站的代碼,他們用的是 getYear()
var enabled = 0;
today = new Date();
var day;
var date;
var centry;
if (today.getDay() == 0) day = "星期日"
if (today.getDay() == 1) day = "星期一"
if (today.getDay() == 2) day = "星期二"
if (today.getDay() == 3) day = "星期三"
if (today.getDay() == 4) day = "星期四"
if (today.getDay() == 5) day = "星期五"
if (today.getDay() == 6) day = "星期六"
centry = "";
if (today.getYear() &< 2000) centry = "19"; date1 = centry + (today.getYear()) + "年" + (today.getMonth() + 1) + "月" + today.getDate() + "日 "; date2 = "" + day; document.write(date1 + date2);
因此,也就是只能獲得 113 這個尾數。
所以,他寫了這麼一句if (today.getYear() &< 2000) centry = "19";
注意,centry 他用的 是字元串 !!(想起來了,這貨該是拷貝 19xx 年的代碼)
date1 = centry + (today.getYear())
date1 = "19" + "113" // return 19113
if (today.getYear() &< 2000) centry = 1900;
date1 = (centry + today.getYear()); // return 2013
而 為什麼 IE 8 能得到 正確的值呢。
javascript date getYear() returns different result between IE and Firefox, how to approach this?老版本 IE 中 ,getYear() 得到的就是 getFullYear() 的值(在 &> 1999 的時候,1900 ~ 1999 還是返回的最後兩位)。==========7月2日更新================今天再去看國家信訪局的網站,發現已經修復了。有人跟他們反映了?改得挺快,贊一個。這是他們現在的代碼,寫法已經科學很多了。
var day="";
var month="";
var ampm="";
var ampmhour="";
var myweekday="";
var year="";
mydate=new Date();
mymonth=mydate.getMonth()+1;
myday= mydate.getDate();
myyear= mydate.getYear();
year=(myyear &> 200) ? myyear : 1900 + myyear;
document.write(year+"年"+mymonth+"月"+myday+"日");
==========以下是原回答=================
才看到……好坑爹……
我原來答在這兒了……國家信訪局網站多少錢做的?
我直接貼過來好了
=====================回答不了題主標題上那個問題,題主看起來也就是一句氣話。關於「今天是 19113年7月1日 星期一」的問題則很簡單可以回答(不知道題主自己是不是程序員,如果是的話,就當我是給其他非程序員科普了)
&
centry + (today.getYear())
getYear() 是一個函數,它會返回一個值。
Per the ECMAScript specification, getYear returns the year minus 1900, originally meant to return "98" for 1998. getYear was deprecated in ECMAScript Version 3 and replaced with getFullYear().
根據規範,這個函數返回值是當前年份減去 1900。在排除了 Y2K 問題以後[1],要正確顯示年份,那就應該把返回值加上 1900, 得到正確年份。而這裡犯的錯誤就是,這裡的 +,不是數字上的加,而是字元相連的意思(就上面的一句 if (today.getYear()&<2000 ) centry = "19" 來看,作者確實是要用字元相連的意思),於是本該是 1900 + 113 = 2013,變成了,19 + 113 = 19113。這個錯誤也就是編程初學者才會犯??
但是,這個函數在很久以前就已經被一個新的沒有bug的函數取代了,就是 getFullYear(),用這個函數就可以直接獲取 4 位數年份,由此可見,這個網站的開發者要麼就是老古董,要麼就是複製粘貼了老古董的代碼。
-----------------吐 槽 分 割 線--------------------
吐槽來了,一上來的一串 var,就不說可以用逗號全部連起來了,你第二個 today 漏掉沒有 var 是什麼意思?還有 date,你 var 了結果下面自說自話沒有用 date 反而用了 date1, date2 是什麼意思?接下來一堆 if ??(而且好像只會寫 if 都不會寫 else)switch case 老師沒有教過嗎?沒有嗎?再來是這句了today.getYear()&<2000
我們這群人是沒希望或者看到 today.getYear()&>2000 的好嗎!!(說明,getYear = 今年 - 1900,也就是條件成立要 3901年 )
在低版本 IE(&<=8)中,getYear() &>1999 的時候是等於 getFullYear(),所以他們的用戶是看不到這種低級錯誤的。
經過我查證,ie6-9,顯示的都是 2013。ie 10 開始跟隨標準,顯示 19113。我不知道應該用什麼表情面對 ie 了……
鑒於上面這段代碼,結合隨筆掃了一眼那個頁面的 HTML 寫法,我覺得這代碼風格有年頭了啊,用了十幾年了么親?
可是我看了一下 archive,http://web.archive.org/web/*/http://www.gjxfj.gov.cn/ ,看起來好像是 05 年的網站啊,哦,至少寫了就再也沒改過,我知道了。不好意思,寫那麼長,我真不是來裝13的,這滿滿的都是愛。
編程真是一件有趣的事啊,有沒有?
-------------------------------------------------------------------[1] Y2K,千年蟲的問題是,那個 getYear() 的返回值永遠只有兩位數,因為當初是19xx年,由於各種原因(詳見擴展閱讀),只用兩位數來表示年份。這麼一來,2003年的返回值就是 03 ,那我們把 1900 +03 = 1903,坑爹啊!真正的問題是這個日期根本不應該讓前端JavaScript輸出,而是後台輸出。
簡而言之,從 ECMAScript v3 開始,JavaScript 獲取年份的實現就不再使用getYear(),而使用 getFullYear() 方法取而代之!正是因為政府網站屬於ie6時代的產物所以才造成了這個問題。
政府網站的技術人員只認識低版ie造成你的打開方式不正確。
推薦閱讀:
※明明是軟體開發的,但別人當你是修電腦的?
※Facebook 在不斷分拆獨立業務,豆瓣卻在聚合業務,到底誰是正確的?
※Mightybell 怎麼樣?
※程序員為什麼沒有工會? TAG:互聯網 | 計算機 | 政府網站 |