Подтвердить что ты не робот

Почему 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?

4b9b3361

Ответ 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);
}