为什么Javascript将00的两位数年份评估为1900而不是2000?

时间:2011-12-30 16:20:28

标签: javascript date

我有一个旧的网络应用程序,其中Javascript用于验证某些日期。用户通常使用2位数年份,我最近发现它将00评为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;
}

在第一个框中输入1/1/99而在第二个框中输入1/1/00将导致错误消息,指出开始日期必须在结束日期之前,因为99在1999年评估而00在1900评估

当然,用户可以使用4位数年来解决这个问题,但我仍然想知道如何让Javascript正确评估2位数年份。

所以我的问题是,如何让Javascript将00评估为2000而不是1900?

5 个答案:

答案 0 :(得分:21)

之所以如此,是因为这种语言是在1990年代(并且匆忙)创建的。您可以使用getFullYear()setFullYear()以非愚蠢的方式处理年份。

我所做的是编写一些代码来检查年份值是否小于100,如果它大于90(或类似的适当的东西,取决于具体情况),假设它是在20世纪,否则假设21日。

并且@Rachel没有办法告诉运行时库的行为不同,至少没有任何标准化方式。这就是日期代码的工作方式。

答案 1 :(得分:20)

最简单的方法就是接受它就是这样做并检查它。

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

1970当然只是一个示例值,因为你必须有一个合理的断点。您可能希望将其作为当前年份 - 而不是当然的常量。

答案 2 :(得分: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

答案 3 :(得分:1)

我过去做过这种方式的方法是选择一个任意年份,让代码假设在任意年份之前的2位数年份是在1900年,而在此之后的几年是在2000年代。对于一个会计应用程序我必须符合Y2K,如果我没记错,我选择了1940年。因此40-99之间的交易是1940-1999,交易00-39是2000-2039。

答案 4 :(得分: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);
}