2008-10-02 11 views
29

que tienen un problema -Javascript constructor Date() no funciona

El javascript Date("mm-dd-yyyy") constructor no funciona para FF. Funciona bien para IE.

  • IE: new Date("04-02-2008") =>"Wed Apr 2 00:00:00 EDT 2008"
  • FF2: new Date("04-02-2008") =>Invalid Date

Así que vamos a tratar de otro constructor. Tratando este constructor Date("yyyy", "mm", "dd")

  • IE: new Date("2008", "04", "02"); =>"Fri May 2 00:00:00 EDT 2008"
  • FF: new Date("2008", "04", "02"); =>"Fri May 2 00:00:00 EDT 2008"
  • IE: new Date("2008", "03", "02"); =>"Wed Apr 2 00:00:00 EDT 2008"
  • FF: new Date("2008", "03", "02"); =>"Wed Apr 2 00:00:00 EDT 2008"

Así el constructor Date("yyyy", "mm", "dd") usa un inde x de 0 para representar enero.

¿Alguien ha tratado esto?
Debe haber una mejor manera que restar 1 de los meses.

Respuesta

44

Es el definition of the Date object para usar los valores 0-11 para el campo month.

Creo que el constructor que usa una Cadena depende del sistema (sin mencionar la configuración regional/zona horaria) por lo que probablemente sea mejor utilizar el constructor donde especifique año/mes/día como parámetros separados.

Por cierto, en Firefox,

new Date("04/02/2008"); 

funciona bien para mí - que interpretará barras, pero no guiones. Creo que esto prueba mi punto de que usar un String para construir un objeto Date es problemático. Use valores explícitos para mes/día/año en su lugar:

new Date(2008, 3, 2); 
1

tiene usted razón, el mes se indica como un índice, por lo que enero es el mes número 0 y diciembre es el mes número 11 ...

- y no hay trabajo en torno a como se afirma claramente en el script ECMA-definición, aunque sencillos trucos comúnmente trabajarán:

var myDate = "2008,03,02".split(","); 
var theDate = new Date(myDate[0],myDate[1]-1,myDate[2]); 
alert(theDate); 
17

buen truco de hecho, que acabo de encontrar la manera dura (por el pensamiento a través de él). pero utilicé una cadena de fecha más natural con un guión :-)

var myDateArray = "2008-03-02".split("-"); 
var theDate = new Date(myDateArray[0],myDateArray[1]-1,myDateArray[2]); 
alert(theDate); 
3

Usando

var theDate = new Date(myDate[0],myDate[1]-1,myDate[2]); 

está muy bien, pero muestra algunos comportamientos extraños cuando los valores de mes y día son erróneas.

Pruebe a emitir una fecha donde myDate[1]-1 y myDate[2] tienen valores de 55. Javascript todavía devuelve una fecha, aunque la entrada obviamente no es correcta.

Hubiera preferido que javascript devuelva un error en tal caso.

2

@Frank: tienes razón. Cuando necesite validar la fecha,

var theDate = new Date(myDate[0],myDate[1]-1,myDate[2]); 

no funcionará.

Lo que sucede es que sigue agregando el parámetro adicional. Por ejemplo:

new Date("2012", "11", "57") // Date {Sat Jan 26 2013 00:00:00 GMT+0530 (IST)} 

El objeto de fecha toma los días adicionales (57-31 = 26) y lo agrega a la fecha que creamos.

O si intentamos construir un objeto con fecha:

new Date("2012", "11", "57", "57") //Date {Mon Jan 28 2013 09:00:00 GMT+0530 (IST)} 

un extra de 2 días y 57 (= 24 + 24 + 9) Se añaden 9 horas.