2011-12-30 6 views
22

Tengo una aplicación web antigua donde Javascript se usa para validar algunas fechas. Los usuarios suelen utilizar 2 dígitos años y recientemente he descubierto que estaba evaluando 00 como 1900 en lugar de 2000¿Por qué Javascript evalúa un año de 2 dígitos de 00 como 1900 en lugar de 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; 
} 

Introducción 1/1/99 en el primer cuadro y 1/1/00 en el segundo causará un error mensaje que dice que la fecha de inicio debe ser anterior a la fecha de finalización porque 99 está evaluando en 1999 mientras 00 está evaluando a 1900.

Por supuesto, los usuarios pueden evitar esto usando años de 4 dígitos, pero aún quiero saber qué se puede hacer para que Javascript evalúe correctamente los años de dos dígitos.

Así que mi pregunta es, ¿cómo puedo obtener Javascript para evaluar 00 como 2000 y no 1900?

Respuesta

21

Lo hace porque el lenguaje se creó en la década de 1990 (y con prisa). Puede usar getFullYear() y setFullYear() para manejar años de una manera no ridícula.

Lo que he hecho es escribir un código para verificar los valores anuales de menos de 100, y si es mayor que 90 (o algo similar apropiado, según la situación) suponga que es del siglo XX; de lo contrario, suponga el 21 .

Y @Rachel no, no hay manera de decirle a la biblioteca de tiempo de ejecución que se comporte de manera diferente, al menos no de una manera estandarizada. Así es como funciona el código de fecha.

+0

Eso explica el por qué, pero hay una manera de hacer Javascript evaluar 00 como 2000 en lugar de 1900? – Rachel

+0

+1 para la historia de fondo. Formato de código agregado :) @ Rachel, use 'setFullYear()' basado en la lógica de negocios que 00 es 2000. –

+0

Lo siento tío editaré sus ediciones en :-) – Pointy

1

La forma en que he hecho esto en el pasado es seleccionar un año arbitrario que permita al código suponer que 2 dígitos años antes de ese año arbitrario son en el 1900, mientras que años después están en el 2000. Para una aplicación de contabilidad, tuve que cumplir con Y2K, si no recuerdo mal, elegí 1940. Así que las transacciones entre 40-99 fueron 1940-1999, y las transacciones 00-39 fueron 2000-2039.

19

La forma más sencilla es aceptar que lo hace de esa manera y verificarlo.

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

1970 es, por supuesto, sólo un valor de ejemplo que usted tiene que tener un punto de ruptura sensible. Es posible que desee hacer eso como el año actual - x en lugar de una constante, por supuesto.

+1

+1 para una muestra de código. –

5

Chrome realmente maneja esto correctamente, pero IE y Firefox (al menos) no. Aquí está mi solución:

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

Su código no funcionará como se espera para los días bisiestos en años que son divisibles por 400 (p. Ej., 1600, 2000, 2400). Por ejemplo, 2/29/00 se considerará una fecha no válida porque 1900 no fue un año bisiesto, pero 2000 fue. – Theophilus

0

hay una razón por la que no se podía hacer algo en este sentido? La gran suposición es que si el usuario está ingresando un año de 2 dígitos probablemente no esté destinado a tener más de 100 años en el pasado.

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); 
 
}

Cuestiones relacionadas