2011-05-02 17 views
10

Tengo curiosidad si alguien tiene alguna buena solución para construir fechas con precisión antes del año 1000 A.D., particularmente en los años 1 - 100 DC.Consejos para trabajar con pre-1000 A.D. Fechas en JavaScript

Por ejemplo, si quiero construir una fecha para el inicio de la primera milenio, no puedo simplemente hacer ...

new Date(Date.UTC(1,0,1,0,0,0,0)); 

porque trata de ser "inteligente" y asumir que 1 es 1901, lo que me da ...

Sun Dec 31 1900 18:00:00 GMT-0600 (CST) 

lo mismo vale para el año 99 ...

new Date(Date.UTC(99,0,1,0,0,0,0)); 

que se convierte en

Thu Dec 31 1998 18:00:00 GMT-0600 (CST) 

¿Pensamientos?

+1

Me encanta esto. Tipo de error anti-Y2K. Esto es precisamente lo que sucede cuando las cosas están mal escritas y luego se piratean después de los hechos. –

+0

¿Está utilizando 'getFullYear()' en lugar de 'año' debido a algún problema con las incoherencias de zona horaria que aparecerían?Tal vez si el mes fue -1, por ejemplo, ¿podría terminar cambiando el año? Sólo curioso. – ErikE

Respuesta

2

Aquí está la solución básica que se me ocurrió. Si una fecha es anterior al año 1000, solo le agrego 1000 mientras construyo la fecha, luego uso setUTCFullYear() después.

if (year >= 0 && year < 1000) { 
    var d = new Date(Date.UTC(year + 1000,mon,day,hour,min,sec,0)); 
    d.setUTCFullYear(d.getFullYear() - 1000); 
    return d; 
} 

1000 puede ser exagerado ya que solo estaba teniendo problemas con las fechas anteriores a 100 ... pero, lo que sea.

0

Realice una fecha arbitraria d y llame al d.setUTCFullYear(myDate). Esto parece funcionar para mí en la consola de Chrome.

+0

esta solución solo establecería el valor de año correcto, mientras que los componentes de la otra vez serían 'arbitrarios'. * sonrisa * Pero en serio, en el espíritu de su respuesta, por lo que estoy seguro de que quiere decir, estoy de acuerdo en que esta es la solución más limpia. –

1

¿Ha intentado utilizar el setUTC... functions en un objeto de fecha después de su creación?

setUTCDate() 
setUTCFullYear() 
setUTCMonth() 
setUTCHours() 
setUTCMinutes() 
setUTCSeconds() 
+0

Necesitaba convertir una cadena de fecha de SAP ("aaaammdd") en una fecha de JavaScript. SAP usa fechas que van desde el 01/01/01 hasta el 9999/12/31. Analicé el año, el mes y la fecha en cadenas simples, inicié una fecha predeterminada 'var date = new Date (0);' y utilicé los ajustadores '.setUTC ...()'. No olvide que los meses están basados ​​en 0 (enero = 0). – bassim

0

Otros han dado indicios de una solución. El objeto de fecha de javascript se copió de Java, por lo que también tiene todos sus errores. No hay mucho sentido para Gregorian fechas antes de 1582 de todos modos desde antes que otros calendarios estaban en uso.

+0

guau, no estaba al tanto de que el objeto de fecha de Java auto resta 1900. ¡Ay! el punto de las fechas gregorianas antes de 1582 es por qué incluso hay un nombre para tal cosa: un calendario "proléptico": http://en.wikipedia.org/wiki/Proleptic_Gregorian_calendar –

0

Es exactamente lo que Date.UTC y la función del constructor Date (llamada con números como argumentos) are supposed to do. Una solución sencilla es utilizar Date.parse, que no se aplicará ninguna corrección

new Date(Date.parse('0001-01-04')); 
new Date(Date.parse('0001-01-04T18:00:00Z')); 
+0

Entiendo que los constructores estaban trabajando como se diseñaron. Mi pregunta era cómo evitarlo. 'Date.parse()' es una solución interesante, gracias. – broox

1

prefiero:

var d = new Date(Date.UTC(year,mon,day,hour,min,sec,0)); 
d.setUTCFullYear(year); 

hay si lo es, y lo es, o sino lo es. literalmente. ;)

la llamada a setUTCFullYear() corrige el error intencional de de JavaScript si me preguntas. Te doy todo el crédito, broox. Vi su gran solución y la llevé 2 pasos más: no es necesario restar ningún año cuando ya tenemos el año correcto en una variable. y no hay necesidad de una instrucción if cuando siempre podemos ejecutar el bloque if.

gracias por su super respuesta, broox!

Cuestiones relacionadas