Foros del Web » Programando para Internet » Javascript »

Curiosidad con objeto Date

Estas en el tema de Curiosidad con objeto Date en el foro de Javascript en Foros del Web. Que tal gentes. Estaba jugando con JS para hacer una comparación de fechas (como objeto DATE) y sucede algo bastante curioso. Ejemplo: fecha1 = new ...
  #1 (permalink)  
Antiguo 29/11/2007, 11:14
 
Fecha de Ingreso: diciembre-2003
Mensajes: 1.583
Antigüedad: 20 años, 4 meses
Puntos: 13
Curiosidad con objeto Date

Que tal gentes.
Estaba jugando con JS para hacer una comparación de fechas (como objeto DATE) y sucede algo bastante curioso. Ejemplo:

fecha1 = new Date("2000/10/01");
fecha2 = new Date("6666/66/66");

Si utilizo esas dos fechas, la comparación (fecha1 < fecha2) devolverá correctamente TRUE. Pero si para la fecha2 utilizo 7777/77/77 o superior, la comparación (fecha1 < fecha2) me devuelve FALSE.

Siguiendo con el jueguito, me di cuenta que a partir de la fecha "7777/70/00", JavaScript la considera como "Invalid Date". La fecha más alta que acepta como objeto Date() es "7777/69/99" (que devolvería "Sun Dec 08 7782 00:00:00: GTM -0300").

¿Alguna explicación para esto?
__________________
El conocimiento es libre: Movimiento por la Devolución
  #2 (permalink)  
Antiguo 29/11/2007, 13:11
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: Curiosidad con objeto Date

Bueno, siento disentir en tu rango de fechas posibles frijolerou. Haciendo pruebas me han salido cosas interesantes. Me hice un script para averiguar la fecha más alta capaz de interpretar mi navegador antes de que se devuelva NaN o Invalid Date (IE ó FF). El resultado ha sido que la fecha más alta está en:
Domingo, 13 de Septiembre de 275760, 02:00:00 000

Además, para confirmar el dato he estado buscando información al respecto: http://www.merlyn.demon.co.uk/js-datex.htm#DRF

Ahí pone que según la especificación ECMA, javascript debe ser capar de manejar hasta 10^8 días después del día cero, esto es, después de 1970-01-01 00:00:00 GMT (no entiendo muy bien que mi límite esté en 2 horas más arriba de 00:00:00, estando en GMT+1... pero sí que me dan exactamente los 100000000 días desde 1970).


Más cosas. El siguiente código me ha funcionado como se espera, se imprime true en IE y en FF:
Código PHP:
var fecha1 = new Date("2000/10/01");
var 
fecha2 = new Date("6666/66/66");
document.write( (fecha1 fecha2) ); 
Si utilizamos 7777/77/77 dará efectivamente false la comparación, pero no porque exista un bug, sino porque el string "7777/77/77" para construir un Date no es válido (pruébalo y ya verás como la fecha es inválida, sin embargo para "7777/69/77" sí es válido). Al parecer esos strings tienen que soportados por el método Number Date.parse(string str), que convierte str en un número, que representa los milisegundos desde la fecha zero. Ese string str tiene que estar en formato IETF, que coordina la manera de escribir una fecha.


Lamentablemente, aunque me he pateado la página web de la organización, no he conseguido hallar nada más que ésto:
Date and Time on the Internet: Timestamps (su versión HTMLizada más cómoda).
Pero acerca de las fechas mal escritas tipo 6666/66/66 -que el sabio intérprete de javascript consigue ajustar- no he encontrado ningún tipo de norma. Según el documento, una fecha debe estar bien escrita, siguiendo éstas normas:
Cita:
date-fullyear = 4DIGIT
date-month = 2DIGIT ; 01-12
date-mday = 2DIGIT ; 01-28, 01-29, 01-30, 01-31 based on
; month/year
time-hour = 2DIGIT ; 00-23
time-minute = 2DIGIT ; 00-59
time-second = 2DIGIT ; 00-58, 00-59, 00-60 based on leap second
; rules
time-secfrac = "." 1*DIGIT
time-numoffset = ("+" / "-") time-hour ":" time-minute
time-offset = "Z" / time-numoffset

partial-time = time-hour ":" time-minute ":" time-second
[time-secfrac]
full-date = date-fullyear "-" date-month "-" date-mday
full-time = partial-time time-offset

date-time = full-date "T" full-time
Que no nos sacan de dudas a la hora de saber que 6666/66/66 funciona y 7777/77/77 no.




Así que seguiremos investigando en qué limites tiene el Date.parse(), que pueden ser de utilidad conocerlos.




¡Buen hilo frijolerou!

__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #3 (permalink)  
Antiguo 29/11/2007, 13:15
Avatar de JavierB
Colaborador
 
Fecha de Ingreso: febrero-2002
Ubicación: Madrid
Mensajes: 25.052
Antigüedad: 22 años, 2 meses
Puntos: 772
Re: Curiosidad con objeto Date

<offtopic>
¿Y qué va a pasar después del Domingo, 13 de Septiembre de 275760, 02:00:00 000? ¿Tendré que cambiar todos los códigos que utilizan fechas? ¡Que pereza!
</offtopic>

Saludos,
  #4 (permalink)  
Antiguo 29/11/2007, 13:42
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: Curiosidad con objeto Date

Cita:
Iniciado por JavierB Ver Mensaje
<offtopic>
¿Y qué va a pasar después del Domingo, 13 de Septiembre de 275760, 02:00:00 000? ¿Tendré que cambiar todos los códigos que utilizan fechas? ¡Que pereza!
</offtopic>

Saludos,
Creo que la biblia dice algo... no estoy muy seguro


He estado probando por el 02:00:00 que me mosquea... Con GMT+1 (Madrid) javascript me dice que estoy en +2 , y si me pongo en GMT+1 de África Central Occidental me dice +1, y mi hora en el sistema no cambia. También noto irregularidades en GMT (Londres, Lisboa), ya que javascript me devuelve +1, estoy algo confuso. Lo hallo con éste código, no sé si es correcto, creo que sí:
Código PHP:
var str "275760/9/13 2:0:0";
var 
ms Date.parse(str);
alert( - new Date(ms).getTimezoneOffset() / 60 );   // me devuelve 2 
Fíjate que diferencia si hacemos, sin cambiar de hora en el sistema:
Código PHP:
alert( - new Date().getTimezoneOffset() / 60 );   // me devuelve 1 
¿No se supone que el getTimezoneOffset() es independiente a la fecha en la que lo ejecutes?

Bueno, pues el caso es que a la conclusión que he llegado es que para el fin del mundo estoy en GMT+2 (aunque mi sistema lo tenga configurado en GMT+1) y que para la fecha actual estoy en GMT+1, como debería ser.

Todo es un poco confuso en este punto... pero tengo claro que para GMT a secas el momento del juicio final es Domingo, 13 de Septiembre de 275760, 00:00:00 000, y luego depende en qué franja horaria estemos moriremos antes o después...


Byes
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:14.