为什么Javascript将2位数的年份00计算为1900而不是2000 ?
Why does Javascript evaluate a 2-digit year of 00 as 1900 instead of 2000?
我有一个旧的web应用程序,其中使用Javascript来验证一些日期。用户通常使用两位数的年份,我最近发现它将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?
最简单的方法就是接受它,这样做并检查它。
if (date.getFullYear() < 1970) {
date.setFullYear(date.getFullYear() + 100);
}
1970当然只是一个示例值,因为您必须有一个合理的断点。当然,你可以把它写成当前年份- x,而不是常量
这样做是因为该语言是在20世纪90年代创建的(而且很匆忙)。您可以使用getFullYear()
和setFullYear()
以一种不愚蠢的方式处理年份。
我所做的是编写一些代码来检查年份值是否小于100,如果大于90(或类似的适当值,取决于情况),则假设它是在20世纪,否则假设是21世纪。
和@Rachel没有办法告诉运行时库不同的行为,至少没有任何标准化的方式。这就是Date代码的工作方式。
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
我过去这样做的方法是选择一个任意年份,让代码假设在该任意年份之前的2位数年份是1900年,而之后的年份是2000年。对于一个会计应用程序,我必须使其符合千年虫标准,如果我没记错的话,我选择了1940。因此,40-99之间的交易是1940-1999,而00-39之间的交易是2000-2039。
有什么原因让你不能这样做吗?大的假设是,如果用户输入一个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);
}
- 单元格的工具提示或标题不显示超过2000个字符
- 我希望这个日期选择器可以从1990年到2000年之间的年份中选择日期
- Date.parse(0) 返回 2000 的午夜,为什么
- 使用新值循环 2000 个元素的数组时,浏览器更新元素需要很长时间
- 错误:超时超过 2000 毫秒.带有承诺的单元测试
- 为什么setTimeout(“otherFunction()”;,2000)错误
- Windows 2000 VS IIS7.5 Windows 2012可压缩性Javascript
- 用javascript将日期格式化为2000年1月12日下午12:30
- 当选择2000个文件时,HTML5文件API给出的长度为0
- 传单:如何在没有样式属性的GeoJSON对象中设置2000+个点的样式
- 为什么Javascript将2位数的年份00计算为1900而不是2000 ?
- 如果用户在文本区域中超过2000个字符,则进行软验证
- Dynatree在面对超过2000项时返回错误
- 文本框接受日期's从1900 - 2050在javascript
- 为什么JavaScript将1/1/0000解释为1/1/2000 ?
- 2000毫秒的超时超过了摩卡
- 使用 Q.js 承诺进行单元测试:超时超过 2000 毫秒