Почему Javascript оценивает 2-значный год 00 как 1900 вместо 2000?
У меня есть старое веб-приложение, в котором 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 году.
Конечно, пользователи могут обойти это с помощью четырехзначных лет, но я все еще хочу знать, что можно сделать, чтобы Javascript правильно оценивал 2-значные годы.
Итак, мой вопрос: как я могу получить Javascript для оценки 00 как 2000, а не 1900?
Ответы
Ответ 1
Он делает это, потому что язык был создан в 1990 году (и в спешке). Вы можете использовать getFullYear()
и setFullYear()
, чтобы обрабатывать годы не-goofy способом.
То, что я сделал, это написать код для проверки значений года менее 100, и если он превышает 90 (или что-то подобное в зависимости от ситуации), предположите это в 20-м веке, в противном случае возьмите 21-й.
И @Rachel нет никакого способа сказать библиотеке времени выполнения вести себя по-другому, по крайней мере, не стандартизованным способом. Это как работает код даты.
Ответ 2
Самый простой способ - просто принять его так и проверить.
if (date.getFullYear() < 1970) {
date.setFullYear(date.getFullYear() + 100);
}
1970 - это, конечно, просто примерное значение, так как вы должны иметь разумную точку останова. Возможно, вы захотите сделать это в текущем году - x вместо константы, конечно.
Ответ 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 before 1950
x.setFullYear(y + 100); //add a century
}
}
output = dateToShortString(x); //custom function to standardize formatting
Ответ 4
То, как я это делал в прошлом, - это выбрать произвольный год, который позволяет предположить, что в течение двух цифр до этого произвольного года в 1900-х годах, а годы после этого - в 2000-х годах. Для бухгалтерского приложения мне пришлось сделать Y2K совместимым, если я правильно помню, я выбрал 1940. Так что транзакции между 40-99 были 1940-1999, а транзакции 00-39 были 2000-2039.
Ответ 5
Есть ли причина, по которой вы не могли бы что-то сделать в этом направлении?
Большое предположение заключается в том, что если пользователь вводит двузначный год, который, вероятно, не был более 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);
}