2010-07-12 12 views
6

Me di cuenta de Date.Parse no se puede manejar solo las fechas de 2 dígitos.Cómo hacer que javascript Date.parse comprenda los años cortos?

Decir que tengo este

mm/dd/yy = 7/11/20 

Fecha de análisis pensará que es = 7/11/1920. ¿Puedes configurarlo para usar el año dos mil? Al igual que es un poco raro, tengo el selector de fecha jquery u.i y si escribe 7/11/20 se dará cuenta 2020.

Así que sería bueno si Date.parse pudiera seguir, prefiero que ambos no sepan lo que está pasando o que ambos sepan qué está pasando y que luego uno que sabe y uno que no sabe.

+1

La mejor solución sería la de proporcionar la fecha completa, siempre. – BrunoLM

+0

@BurnoLM Acepto que es por eso que tengo una ventana emergente de fecha cuando se hace clic en el cuadro de texto, sin embargo, un usuario todavía puede, por algún motivo, escribir manualmente lo que hice "7/11/20" por cualquier razón. No afecta ninguno de mis códigos C#, ya que se da cuenta de que es 2020 pero atornilla algunas de mis listas desplegables que se filtran en función de la fecha. Entonces, si puedo solucionarlo, me gustaría también, por cualquier motivo, jquery validar "fecha" no cree que sea un error de validación y esté en un formato válido. – chobo2

Respuesta

5

No es que yo sepa. Pero siempre se puede ajustar el año:

YourDate="7/11/20"; 
DateObj=new Date(YourDate.replace(/(\d\d)$/,"20$1")); 

alert(DateObj); 

This code in action.

Editar: El siguiente código se encargará de años, tanto completos y cortos:

YourDate="7/11/2020"; 
DateObj=new Date(YourDate.replace(/\/(\d\d)$/,"/20$1")); 

alert(DateObj); 

This code in action.

+1

¡Es un buen truco! – BrunoLM

+0

¿Qué está haciendo? Estoy un poco confundido con $ 1 también el usuario siempre podría dar una fecha completa. Entonces esto falla. Entonces, ¿cómo podría ser modificado? – chobo2

+0

@BrunoLM - Gracias.:) –

0

Entonces, la pregunta es si se puede cambiar la forma en que Date.parse funciona de modo que los d ates se interpretan como fechas posteriores al año 2000?

Sí, se puede hacer, simplemente sombree Date.parse con su propia función de análisis.

// don't do this! 
Date.parse = function (str) { /* your parse routine here */ } 

Por supuesto, por lo general es una muy mala idea a la sombra de propiedades (incluyendo las propiedades de función también conocido como 'Métodos') de objetos de acogida, porque va a causar un comportamiento incorrecto en otras secuencias de comandos que esperan esas propiedades a trabajar de una manera determinada .

También es una mala idea usar fechas de dos dígitos, pero eso podría estar fuera de su control. Si no está fuera de su control, le aconsejaría que simplemente olvide las fechas de 2 dígitos y use el valor anual completo.

+1

Solo para hacer cumplir: ¡esto es muy, muy peligroso! – BrunoLM

+0

Ya no creo que vaya a hacer eso jajaja. – chobo2

-1

¿Qué tal esto?

var date = '7/11/20'; 
var idx = date.lastIndexOf('/') + 1; 
date = date.substr(0,idx) + '20' + date.substr(idx); 
var result = Date.parse(date);​ 
alert(result); 

o esta versión que probará primero el formato YYYY.

var date = '7/11/2020'; 
var idx = date.lastIndexOf('/') + 1; 
if(date.substr(idx).length < 4) { 
    date = date.substr(0,idx) + '20' + date.substr(idx); 
} 
var result = Date.parse(date); 
alert(new Date(result))​;​ 
+0

No funciona muy bien, usted sabe ... '7/11/2000 = 7/11/202000' – BrunoLM

+0

@BrunoLM - Creo que se supone que el formato YY siempre se utilizará. Lo suficientemente fácil como para agregar una prueba para un formato YYYY. – RightSaidFred

+0

Bueno, un usuario podría escribir en YY o YYYY. No estoy seguro de que YYY no sepa si eso funciona. Sé que los primeros 2 C# pueden descifrar y analizar, y también pueden marcar la fecha. – chobo2

0

Aquí está mi solución:

function parseDate(stringValue) 
{ 
    var date = new Date(stringValue); 
    if (!isNaN(date.getTime())) 
    { 
     // if they typed the year in full then the parsed date will have the correct year, 
     // if they only typed 2 digits, add 100 years to it so that it gets translated to this century 
     if (stringValue.indexOf(date.getFullYear()) == -1) 
     { 
      date.setFullYear(date.getFullYear() + 100); 
     } 

     return date; 
    } 
    else 
    { 
     return null; 
    } 
} 
Cuestiones relacionadas