2011-12-30 67 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); 
 
}

相关问题