2008-10-28 18 views
10
today1 = new Date(); 
today2 = Date.parse("2008-28-10"); 

Para comparar los valores de tiempo (milisegundos) de estos tengo que hacer lo siguiente, porque today2 es solo un número.¿Por qué Date.parse no devuelve un objeto Date?

if (today1.getTime() == today2) 

¿Por qué es esto?

+0

¿Y cuál es el problema en eso? ¿Por qué necesitas hacerlo en un solo paso? ¿Hay alguna necesidad comercial? – mohammedn

+1

Mi problema es que yo, y estoy seguro de que otros, esperarían que un método de análisis en un objeto devuelva un objeto del tipo al que se llama el método. – ProfK

Respuesta

25

Para responder a la pregunta del título: porque decidieron por lo que cuando se crea el código JavaScript idioma. Probablemente porque la función de análisis de Java java.util.Date estaba haciendo lo mismo, y querían imitar su comportamiento para que el idioma se sintiera más familiar.

Para responder a la pregunta en el texto ... Utilice esta construcción para conseguir dos objetos de fecha:

var today2 = new Date(Date.parse("2008-10-28")); 

EDIT: Un simple

var today2 = new Date("2008-10-28"); 

también funciona.

Nota que Internet Explorer (es decir, JScript) no entiende guiones en la cadena de fecha. Sin embargo, funciona con barras inclinadas:

var today2 = new Date("2008/10/28"); 
+1

El centro es el mes y el tercero es la fecha? –

+4

@Derek: Sí. Esa es la única notación de fecha que tiene algún sentido. – Tomalak

4

Si mal no recuerdo, Date le da un valor inferior al milisegundo que creó el objeto Date. Por lo tanto, a menos que este código se ejecute exactamente el 2008-28-10 a las 00: 00: 00: 000, no será el mismo.

Solo una adición: Date.parse() por definición devuelve un valor largo que representa el valor en milisegundos de la Fecha, y no el objeto Date en sí. Si desea mantener el mismo objeto Date, simplemente construirlo así:

var newDate = new Date(); 
newDate.setFullYear(2008,9,28); 

Para mayor referencia de salida: the Date class reference

+0

Eso no responde a la pregunta original, que, reformulada, era '¿Por qué es el tipo, devuelto por Date.parse, un entero, en lugar de una fecha?'. No sé la respuesta a esto tampoco, pero rechazo la oportunidad de ofrecer una respuesta incorrecta como alternativa. – belugabob

+0

Como agregué, Date.parse por def devuelve el valor de milisegundo, vea la referencia a la que he vinculado ... –

1

Lo que Data.parse está devolviendo es un NaN. Que fundementalmente es un número indefinido. Esto es lo que devuelve la mayoría de las implementaciones cuando no puede convertir la cadena en una fecha. Algunas implementaciones no tienen nada que ver con una cadena de fecha compatible con RFC 1123 (que es todo lo que requiere la especificación).

Editar: Un comentario a esta respuesta indica que Date.parse no devuelve NaN. Sin embargo, la especificación dice que el análisis debe devolver un número. ¿Qué número debería devolver cuando se le da una cadena que no puede analizar como una fecha? No puede usar 0 o -1 o algún otro valor 'pícaro' porque estos son compensaciones milisegundas válidas desde el 1 de enero de 1970. Mozilla e IE ambos devuelven NaN, lo cual es una acción perfectamente sensata.

Si bien la especificación no excluye el análisis de una cadena como "2008-28-10" a una fecha válida, no lo requiere. No he encontrado implementaciones que hagan algo más de lo requerido en la especificación. Por lo tanto, "10 de octubre de 2008" es lo más cercano que va a llegar a la secuencia de arriba que se analizará correctamente.

+0

Date.parse ciertamente no devuelve un NaN. – ProfK

+0

Pruébalo. Dale "2008-28-10" como en la pregunta y prueba con isNaN. – AnthonyWJones

+0

Disculpa, estaba haciendo una codificación de "cuadro de preguntas" y usé el formato de fecha incorrecto. Sin embargo, podrías haber señalado que mi Date.parse() particular estaba devolviendo un Nan. – ProfK

2

No puedo responder en lugar de los diseñadores de idiomas, pero puede utilizar el resultado de Date.parse o Date.UTC en el constructor de fechas para obtener dicho objeto.

Tenga en cuenta que el código de muestra es incorrecto: no es un formato de fecha válido, no ISO (aaa-mm-dd) ni IETF (lun, 25 de diciembre de 1995 13:30:00 GMT + 0430). Entonces obtendrás un NaN. Date.parse solo entiende el formato IETF, por lo que he leído en MDC.

Si necesita comparar dos fechas, puede comparar los resultados de .getFullYear(), .getMonth() y .getDay(), o simplemente comparar las representaciones de las cadenas en el nivel deseado.

var d1 = new Date(); 
var n = Date.parse("28 Oct 2008"); 
var d2 = new Date(n); 
var d3 = new Date("28 october 2008"); 

alert(d1.toDateString() == d2.toDateString()); 
alert(d2.toDateString() == d3.toDateString()); 
Cuestiones relacionadas