【问题标题】:Why does Javascript evaluate a 2-digit year of 00 as 1900 instead of 2000?为什么 Javascript 将 00 的两位数年份评估为 1900 而不是 2000?
【发布时间】:2011-12-30 16:20:28
【问题描述】:

我有一个旧的网络应用程序,其中 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?

【问题讨论】:

    标签: javascript date


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      之所以这样做,是因为该语言是在 1990 年代(而且很匆忙)创建的。您可以使用getFullYear()setFullYear() 以一种不傻的方式处理年份。

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

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

      【讨论】:

      • 这解释了原因,但是有没有办法让 Javascript 将 00 评估为 2000 而不是 1900?
      • 背景故事+1。添加了代码格式:) @Rachel,根据 00 是 2000 的业务逻辑使用 setFullYear()
      • @JasonMcCreary 不,我的意思是我们发生了冲突,网站保存了我的更新,但没有合并您的更改。
      【解决方案3】:

      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
      

      【讨论】:

      • 对于可以被 400 整除的年份(例如 1600、2000、2400)的闰日,您的代码将无法正常工作。例如,2/29/00 将被视为无效日期,因为 1900 年不是闰年,但 2000 年是。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        你有什么理由不能按照这些思路做某事吗? 最大的假设是,如果用户输入的是 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);
        }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-03-15
          • 2011-01-02
          • 1970-01-01
          • 2018-08-16
          • 2013-12-30
          • 1970-01-01
          • 2011-10-11
          相关资源
          最近更新 更多