2010-08-17 22 views
44

Tengo un código que intenta analizar una cadena de fecha.Diferencia entre Date (dateString) y new Date (dateString)

Cuando hago alert(Date("2010-08-17 12:09:36")); Analiza correctamente la fecha y todo funciona bien, pero no puedo llamar a los métodos asociados con Date, como getMonth().

cuando intento:

var temp = new Date("2010-08-17 12:09:36"); 
alert(temp); 

me da un error "Fecha no válida".

Alguna idea sobre cómo analizar "2010-08-17 12:09:36" con una nueva fecha()?

+0

hace alerta (Fecha ("2010-08-17 12:09:36") getMonth().); ¿trabajo? Acabo de pegar var temp = new Fecha ("2010-08-17 12:09:36"); alerta (temperatura); en una página HTML y funcionó bien. – Zebi

+0

Utilice una nueva fecha ("2010-08-17T12: 09: 36") o una nueva fecha ("2010-08-17T12: 09: 36Z") para la hora UTC. – Jack

Respuesta

56

Fecha()

Con esto se llama a una función llamada Date(). No acepta ningún argumento y devuelve una cadena que representa la fecha y hora actuales.

nuevos Fecha()

Con esto va a crear una nueva instancia de la fecha.

Sólo puede utilizar los siguientes constructores:

new Date() // current date and time 
new Date(milliseconds) //milliseconds since 1970/01/01 
new Date(dateString) 
new Date(year, month, day, hours, minutes, seconds, milliseconds) 

lo tanto, utilizar 2010-08-17 12:09:36 como parámetro al constructor no está permitido.

Ver w3schools.


EDIT: new Date(dateString) utiliza uno de estos formatos:

  • "13 de octubre de, 1975 11:13:00"
  • "13 de octubre de, 1975 11:13"
  • "Octubre 13, 1975 "
+0

¿No hay otra manera de procesar la cadena sin crear mi propio analizador de fechas? – Yoshi9143

+0

No sé cómo hacer esto usando js nativos. Pero puede usar un analizador externo, como datejs (http://www.datejs.com/) – Topera

+2

También en Chrome y Firefox, la nueva fecha() funciona de manera diferente. Por ejemplo, "aaaa-mm-dd hh: mm: ss" es adecuado para Chrome pero no para Firefox. – sunprophit

1

formas correctas a usar Fecha: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date

Además, el siguiente fragmento de código muestra cómo, con una sola definición de la función de "Animal", que puede ser a) llama directa y b) una instancia tratándolo como una función constructora

function Animal(){ 
    this.abc = 1; 
    return 1234; 
} 

var x = new Animal(); 
var y = Animal(); 

console.log(x); //prints object containing property abc set to value 1 
console.log(y); // prints 1234 
0

No aparece el error de" fecha no válida ". Más bien, el valor de la temperatura es "Fecha no válida".

¿Su cadena de fecha tiene un formato válido? Si utilizas Firefox, comprobar Date.parse

En Firefox Javascript consola:

>>> Date.parse("2010-08-17 12:09:36"); 
NaN 
>>> Date.parse("Aug 9, 1995") 
807944400000 

me gustaría probar un formato de cadena de fecha diferente.

Zebi, ¿está utilizando Internet Explorer?

+0

Debería haber una "T" en lugar del espacio en blanco –

-2

Recientemente me encontré con esto también y esta fue una publicación útil. Tomé el Topera por encima de un paso más allá y esto funciona para mí, tanto en Chrome y Firefox:

var temp = new Date( Date("2010-08-17 12:09:36") ); 
alert(temp); 

la llamada interna a Date() devuelve una cadena que new Date() puede analizar.

+0

¿Cuál es el uso de dos 'Date()' aquí cuando puede alimentar directamente la cadena en el constructor 'Date'. –

+1

@friesrf Tu respuesta es completamente incorrecta. La fecha de llamada ("2010-08-17 12:09:36") siempre devolverá el valor de llamar a Date() sin ningún parámetro. Por lo tanto, con el fragmento de código anterior, nunca obtendrá el objeto de fecha analizado de cadena de fecha malformada, sino un nuevo objeto de fecha que es equivalente a ahora. El código no produce un error nunca significa que sea funcionalmente correcto. –

35

El siguiente formato trabaja en todos navegadores:

new Date("2010/08/17 12:09:36"); 

tanto, para hacer una cadena de fecha con formato yyyy-mm-dd hh:mm:ss totalmente compatible en el navegador que tendría que reemplazar guiones con barras:

var dateString = "2010-08-17 12:09:36"; 
new Date(dateString.replace(/-/g, "/")); 
+1

+1: funcionó para mí en IE5-11 y parece la solución más simple al convertir una fecha de cadena de estilo ISO-8601. – Roberto

+0

No, no hagas eso. Es mucho mejor implementar una función de 2 líneas para analizar manualmente la cadena (o usar una biblioteca, pero no es realmente necesario). La especificación del lenguaje no requiere que los navegadores analicen ** cualquier ** cadena que no sea el formato ISO 8601, y algunos tampoco lo admiten. – RobG

0

I estaba teniendo el mismo problema al usar una llamada API que respondía en formato ISO 8601. Trabajando en Chrome esto funcionó: `

// date variable from an api all in ISO 8601 format yyyy-mm-dd hh:mm:ss 
    var date = oDate['events']['event'][0]['start_time']; 
    var eventDate = new Date(); 
    var outputDate = eventDate.toDateString(); 

`

pero esto no funcionó con Firefox.

encima respuesta me ayudó a formatearlo correctamente para Firefox:

// date variable from an api all in ISO 8601 format yyyy-mm-dd hh:mm:ss 
var date = oDate['events']['event'][0]['start_time']; 
var eventDate = new Date(date.replace(/-/g,"/"); 
var outputDate = eventDate.toDateString(); 
+0

No, no pase cadenas al constructor Fecha. El análisis de una fecha ISO 8601 requiere 2 líneas de código, haga eso en su lugar. – RobG

+0

@RobG ¡Buena respuesta, gracias! – sherkon18

3

Sé que esto es viejo, pero, con mucho, la solución más fácil es utilizar sólo

var temp = new Date("2010-08-17T12:09:36"); 
+0

Esto falla en Safari. –

+2

El hecho de que falle en Safari no significa que no sea un uso correcto de JavaScript. Tampoco tengo Safari para probar esto, pero no sé por qué algo así de omnipresente funcionaría en algunos navegadores y no en otros. En cualquier caso, definitivamente no merece un voto negativo. –

+1

@ TheComposer: bienvenido al mundo de las secuencias de comandos del navegador. Hasta ES5, había ** cadena ** que los navegadores estaban obligados a analizar por el estándar. Algunos de esos navegadores todavía están en uso.Es una certeza de que en cualquier momento hay navegadores en uso que no son totalmente compatibles con el estándar más reciente (o incluso uno con pocos años de antigüedad), por lo que debe programar para el denominador común más bajo de lo que admiten los navegadores, no estrictamente lo que establece la especificación actual. – RobG

1

Cualquier ideas sobre cómo analizar "2010-08-17 12:09:36" con nueva fecha()?

Hasta ES5, no había ningún formato de cadena que los navegadores tuvieran que admitir, aunque hay un número que es ampliamente compatible. Sin embargo, el soporte del navegador no es confiable, es inconsistente, por ej. algunos permitirán valores fuera de límites y otros no, algunos admiten ciertos formatos y otros no, etc.

ES5 presentó soporte para algunos formatos ISO 8601, sin embargo, el OP no cumple con ISO 8601 y no todos los navegadores en use soporte de todos modos.

La única manera confiable es usar una función de análisis pequeña. A continuación, analiza el formato en el OP y también valida los valores.

/* Parse date string in format yyyy-mm-dd hh:mm:ss 
 
** If string contains out of bounds values, an invalid date is returned 
 
** 
 
** @param {string} s - string to parse, e.g. "2010-08-17 12:09:36" 
 
**      treated as "local" date and time 
 
** @returns {Date} - Date instance created from parsed string 
 
*/ 
 
function parseDateString(s) { 
 
    var b = s.split(/\D/); 
 
    var d = new Date(b[0], --b[1], b[2], b[3], b[4], b[5]); 
 
    return d && d.getMonth() == b[1] && d.getHours() == b[3] && 
 
     d.getMinutes() == b[4]? d : new Date(NaN); 
 
} 
 
    
 
document.write(
 
    parseDateString('2010-08-17 12:09:36') + '<br>' + // Valid values 
 
    parseDateString('2010-08-45 12:09:36')    // Out of bounds date 
 
);