Почему Javascript оценивает двузначный год 00 как 1900 вместо 2000? - PullRequest
22 голосов
/ 30 декабря 2011

У меня есть старое веб-приложение, в котором 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 во 2-м приведет к появлению сообщения об ошибке о том, что начальная дата должна быть раньше конечной, поскольку 99 оценивается в 1999 году, а 00 оценивается в 1900 .

Конечно, пользователи могут обойти это, используя 4-значные годы, но я все еще хочу знать, что можно сделать, чтобы Javascript правильно оценил 2-значные годы.

Итак, мой вопрос: как я могу заставить Javascript оценивать 00 как 2000, а не 1900?

Ответы [ 5 ]

21 голосов
/ 30 декабря 2011

Это происходит потому, что язык был создан в 1990-х годах (и в спешке).Вы можете использовать getFullYear() и setFullYear(), чтобы обрабатывать годы не глупо.

Что я сделал, так это написал некоторый код для проверки значений года меньше 100, и если оно больше 90(или что-то аналогичное, в зависимости от ситуации) предположим, что это в 20-м веке, в противном случае предположим, 21-го.

И @Rachel no, нет никакого способа сказать библиотеке времени выполнения вести себя по-другому, по крайней мере, не стандартизированопуть.Вот как работает код даты.

20 голосов
/ 30 декабря 2011

Самый простой способ - просто принять, что он делает это таким образом, и проверить его.

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

1970, конечно, лишь примерное значение, поскольку у вас должна быть разумная точка разрыва.Вы можете сделать это в текущем году - х вместо константы, конечно.

5 голосов
/ 05 октября 2012

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
1 голос
/ 30 декабря 2011

Способ, которым я делал это в прошлом, состоит в том, чтобы выбрать произвольный год, который позволяет коду предполагать, что 2-значные годы до этого произвольного года приходятся на 1900-е годы, а годы после этого - на 2000-е годы. Для бухгалтерского приложения мне нужно было обеспечить соответствие требованиям 2000 года, если я правильно помню, я выбрал 1940. Таким образом, транзакции между 40-99 были 1940-1999, а транзакции 00-39 были 2000-2039.

0 голосов
/ 07 февраля 2017

есть ли причина, по которой вы не могли сделать что-то подобноеБольшим предположением является то, что если пользователь вводит двухзначный год, то, вероятно, он не предназначен для того, чтобы быть более 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...