2011-12-30 64 views
22

我有一箇舊的Web應用程序,其中Javascript用於驗證一些日期。用戶通常使用2位數年,我最近發現有人評價00在1900年而不是2000爲什麼Javascript將00的2位數年份評估爲1900而不是2000?

if (new Date(tb[0].value) > new Date(tb[1].value)){ 
    alert('Starting date must come before the ending date'); 
    tb[0].focus(); 
    return false; 
} 

在第2進入第一個框1/​​1/99和00年1月1日的會導致錯誤消息稱開始日期必須在結束日期之前,因爲99在1999年評估,而00在1900評估。

當然,用戶可以使用4位數年份來解決此問題,但我仍然想知道什麼可以通過Javascript來正確評估2位數年份。

所以我的問題是,我怎樣才能得到Javascript來評估00爲2000而不是1900?

回答

21

這樣做是因爲該語言創建於20世紀90年代(並且很匆忙)。您可以使用getFullYear()setFullYear()以非愚蠢的方式處理多年。

我所做的是編寫一些代碼來檢查年值小於100,如果它大於90(或者類似的情況,根據情況而定)假設它是在20世紀,否則假設第21 。

而@Rachel沒有辦法告訴運行時庫行爲不同,至少沒有任何標準化的方式。這就是日期代碼的工作原理。

+0

這就解釋了爲什麼在,但有一種方法,使評價的Javascript 00作爲2000而不是1900年? – Rachel 2011-12-30 16:23:33

+0

+1爲背景故事。添加代碼格式:) @Rachel,使用基於00是2000的業務邏輯的'setFullYear()。 – 2011-12-30 16:24:26

+0

對不起,我會編輯你的編輯回來:-) – Pointy 2011-12-30 16:25:00

1

我過去這樣做的方式是選擇一個任意年份,讓代碼假定在任意年份之前的2位數年份是在1900年,而在那之後的年份是在2000年。對於一個會計應用程序,如果我沒有記錯的話,我必須做出符合2000年的Y2K標準,因此我選擇了1940年。因此,40-99之間的交易是1940-1999,而00-39交易是2000-2039。

19

最簡單的方法就是接受它,然後檢查它。

if (date.getFullYear() < 1970) { 
    date.setFullYear(date.getFullYear() + 100); 
} 

1970當然只是一個示例值,因爲你必須有一個明智的斷點。你可能想把它當做今年 - x當然不是常數。

+1

+1代碼示例。 – 2011-12-30 16:35:00

5

Chrome實際上正確地處理了這個問題,但是IE和Firefox(至少)不能。這是我的解決方案:

var x = new Date(input);    //parse the date initially 

if (x!="Invalid Date") { 

    var n = input.split(/[/-]/);  //regex to look for/or - delimited dates 

    if (n[2].length == 2)    //if the input has a 2 digit year 
    { 
     var y = x.getFullYear(); 
     if (y < 1950)     //and the parser decided it's before 1950 
      x.setFullYear(y + 100);  //add a century 
    } 
} 

output = dateToShortString(x);   //custom function to standardize formatting 
+1

您的代碼將無法如預期的那樣工作在可以被400整除的年份的閏日(例如,,1600,2000,2400)。例如,2/29/00將被視爲無效日期,因爲1900年不是閏年,而是2000年。 – Theophilus 2015-07-20 14:34:13

0

有沒有一個原因,你不能沿着這些方面做些什麼? 這個重要的假設是,如果用戶輸入的是一個2位數的年份,過去可能不會超過100年。

myDate('2-1-00'); 
 

 
function myDate(date) { 
 
    let today = new Date(); 
 
    date = new Date(date.split('-').join('/')); 
 
    if ((today.getFullYear() - date.getFullYear()) >= 100) { 
 
    date.setFullYear(date.getFullYear() + 100); 
 
    } 
 
    alert(date); 
 
}

相關問題