new Date () funciona en Chrome pero no en Firefox

89

Estoy creando una cadena de fecha y hora que se ve así: 2010-07-15 11:54:21

Y con el siguiente código obtengo una fecha no válida en Firefox pero funciona bien en Chrome

var todayDateTime = year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + seconds;
var date1 = new Date(todayDateTime);

En firefox date1 me da una fecha no válida, pero en Chrome funciona bien, ¿cuál sería la causa principal?

pixeldev
fuente
2
si quieres jugar con él de la manera que quieras, ve con datejs.com
Sinan
No todas las implementaciones admiten el formato en ECMA-262, por lo que siempre analice manualmente las cadenas (una biblioteca puede ayudar, pero probablemente no sea necesaria para formatos únicos).
RobG
Funciona Firefox ahora.
Sm Yamashita

Respuestas:

78

No puede crear una instancia de un objeto de fecha de la forma que desee. Tiene que ser de una manera específica. A continuación se muestran algunos ejemplos válidos:

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)

o

d1 = new Date("October 13, 1975 11:13:00")
d2 = new Date(79,5,24)
d3 = new Date(79,5,24,11,33,0)

Chrome debe ser más flexible.

Fuente: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

Del comentario de apsillers :

la especificación EMCAScript requiere exactamente un formato de fecha (es decir, AAAA-MM-DDTHH: mm: ss.sssZ) pero los formatos de fecha personalizados pueden ser admitidos libremente por una implementación : " Si la cadena no se ajusta a ese formato [definido por ECMAScript] la función puede recurrir a heurísticas específicas de implementación o formatos de fecha específicos de implementación " . Chrome y FF simplemente tienen diferentes" formatos de fecha específicos de implementación ".

Chris Laplante
fuente
3
Tengo una solución que funciona en todos los navegadores, incluido Firefox: stackoverflow.com/a/21984717/586051
Rahul Desai
7
En cuanto a por qué existe esta diferencia de navegador: la especificación EMCAScript requiere exactamente un formato de fecha (es decir, YYYY-MM-DDTHH:mm:ss.sssZ) pero los formatos de fecha personalizados pueden ser admitidos libremente por una implementación : " Si la cadena no se ajusta a ese formato [definido por ECMAScript], la función puede recurrir a cualquier heurística específica de implementación o formatos de fecha específicos de implementación " . Chrome y FF simplemente tienen diferentes" formatos de fecha específicos de implementación ".
apsillers
Un ejemplo de formato de fecha (mes que incluye un ".") Que funciona en Chrome pero no en Firefox: 'Feb. 14, 2019 '
codescribblr
23

Esto funciona en todos los navegadores:

nueva fecha ('2001/01/31 12:00:00 AM')

new Date('2001-01-31 12:00:00')

Formato: AAAA-MM-DDTHH: mm: ss.sss

Detalles: http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15

Tahin Rahman
fuente
porque todos sabemos que es un estándar internacional. w3.org/International/questions/qa-date-format
Bobby Tables
6
Entonces, ¿ha probado todos los navegadores ? Y suponiendo que lo haya hecho, ¿también sabe que todos los navegadores en el futuro también admitirán ese formato (no estándar)?
RobG
1
Esto funciona para mi. Entonces, si ya obtiene una cadena de '2001-1-31 12:00:00', simplemente podemos hacer: new Date (str.replace (/ - / g, '/'));
Jianwu Chen
@JianwuChen Está modificando deliberadamente un formato estándar a no estándar. No es Buena idea.
JJJ
2
Después de 3 años, no funciona en Edge y Window Safari.
Mg Thar
13

Opción 1 :

Suponga que su cadena de tiempo tiene un formato similar a este:

'2016-03-10 16:00:00.0'

En ese caso, puede hacer una expresión regular simple para convertirla a ISO 8601:

'2016-03-10 16:00:00.0'.replace(/ /g,'T')

Esto produciría el siguiente resultado:

'2016-03-10T16:00:00.0'

Este es el formato estándar de fecha y hora y, por lo tanto, es compatible con todos los navegadores:

document.body.innerHTML = new Date('2016-03-10T16:00:00.0') // THIS IS SAFE TO USE

Opcion 2 :

Suponga que su cadena de tiempo tiene un formato similar a este:

'02-24-2015 09:22:21 PM'

Aquí, puede hacer la siguiente expresión regular:

'02-24-2015 09:22:21 PM'.replace(/-/g,'/');

Esto también produce un formato compatible con todos los navegadores:

document.body.innerHTML = new Date('02/24/2015 09:22:21 PM') // THIS IS SAFE TO USE

Opcion 3:

Suponga que tiene una cadena de tiempo que no es fácil de ajustar a uno de los estándares bien soportados.

En ese caso, es mejor dividir su cadena de tiempo en diferentes partes y usarlas como parámetros individuales para Date:

document.body.innerHTML = new Date(2016, 2, 26, 3, 24, 0); // THIS IS SAFE TO USE

John Slegers
fuente
1
var d = nueva fecha ('2017-08-28 08:02 PM'.replace (/ - / g,' / ')); Esto funciona perfectamente para mí en Chrome y en Mozilla.
Rahul Mankar
13

Esto también funciona en la mayoría de los navegadores.

new Date('2001/01/31 12:00:00')

Ese es el formato de

"yyyy/MM/dd HH:mm:ss"
Alvis
fuente
3
No hay garantía de que el formato funcione en cualquier navegador, mucho menos en "todos".
RobG
Tienes razón en eso, la respuesta se basa en mi experiencia.
Alvis
8

Si aún desea crear la fecha usando guiones, puede usar este formato:

var date = new Date('2013-08-31T17:00:00Z')

Pero tenga en cuenta que crea la hora según UTC. Es decir, si vive en la zona horaria GMT + 3 (3 horas antes de GMT), se agregará este desplazamiento de zona horaria a la hora. Entonces, el ejemplo anterior tendrá este valor, si GMT + 3 (tenga en cuenta que son las 20:00 y no las 17:00):

Sat Aug 31 2013 20:00:00 GMT+0300 (FLE Standard Time)

Asegúrese de agregar la letra 'Z' al final, porque de lo contrario, Chrome y Firefox analizarán la cadena de manera diferente (una agregará compensación de tiempo y la otra no).

Gabrielius
fuente
1
Sí, Chrome y Firefox se comportan de manera diferente si no proporciona una zona horaria. Y, por interés, creo que Firefox lo hace mal. Debería asumir GMT si la zona horaria está ausente. Chrome lo hace, Firefox no. ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
Julian Jelfs
@ JulianJelfs— " Debe asumir GMT si la zona horaria está ausente ", solo para la fecha (contrario a ISO 8601). Para cadenas de fecha y hora, debe asumir local (consistente con ISO 8601). Pero en cualquier caso, el análisis manual es la única forma segura de hacerlo.
RobG
5

Tenía un problema similar en Firefox y Safari cuando trabajaba con AngularJS. Por ejemplo, si una fecha devuelta de Angular se ve así:

2014-06-02 10:28:00

usando este código:

new Date('2014-06-02 10:28:00').toISOString();

devuelve un error de fecha no válida en Firefox y Safari. Sin embargo, en Chrome funciona bien. Como se indicó en otra respuesta, lo más probable es que Chrome sea más flexible con el análisis de cadenas de fecha.

Mi objetivo final era formatear la fecha de cierta manera. Encontré una biblioteca excelente que manejó tanto el problema de compatibilidad entre navegadores como el problema de formato de fecha. La biblioteca se llama moment.js .

Al usar esta biblioteca, el siguiente código funciona correctamente en todos los navegadores que probé:

moment('2014-06-02 10:28:00').format('MMM d YY')

Si está dispuesto a incluir esta biblioteca adicional en su aplicación, puede crear más fácilmente su cadena de fecha y evitar posibles problemas de compatibilidad del navegador. Como beneficio adicional, tendrá una buena manera de formatear, sumar, restar, etc. fechas fácilmente si es necesario.

Instantánea
fuente
Usted debe siempre pasar el formato de moment.js al analizar cadenas, de lo contrario, sólo conjeturas hasta que encuentra uno que crea una fecha válida.
RobG
4

Esto debería funcionar para ti:

var date1 = new Date(year, month, day, hour, minute, seconds);

Tuve que crear una fecha en una cadena, así que lo hice así:

var d = '2013-07-20 16:57:27';
var date1 = new Date(d.substr(0, 4), d.substr(5, 2), d.substr(8, 2), d.substr(11, 2), d.substr(14, 2), d.substr(17, 2));

Recuerde que los meses en javascript son de 0 a 11, por lo que debe reducir el valor del mes en 1, así:

var d = '2013-07-20 16:57:27';
var date1 = new Date(d.substr(0, 4), d.substr(5, 2) - 1, d.substr(8, 2), d.substr(11, 2), d.substr(14, 2), d.substr(17, 2));
Bartek Kosa
fuente
2

Solución simple, esto funciona con todos los navegadores,

var StringDate = "24-11-2017"   
var DateVar = StringDate.split("-");
var DateVal = new Date(DateVar[1] + "/" + DateVar[0] + "/" + DateVar[2]);
alert(DateVal);
XORG_99
fuente
1

Una situación con la que me he encontrado fue cuando estaba tratando con milisegundos. FF e IE no analizarán esta cadena de fecha correctamente al intentar crear una nueva fecha. "2014/11/24 17:38:20.177Z" No saben cómo manejar .177Z. Sin embargo, Chrome funcionará.

bjo
fuente
0

De hecho, Chrome es más flexible para trabajar con diferentes formatos de cadena. Incluso si no averigua su formato de cadena, Chrome aún puede convertir con éxito la cadena en fecha sin errores. Me gusta esto:

  var outputDate = new Date(Date.parse(inputString));

Pero para Firefox y Safari, las cosas se vuelven más complejas. De hecho, en el documento de Firefox, ya dice: ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse )

Una cadena que representa una fecha RFC2822 o ISO 8601 (se pueden usar otros formatos, pero los resultados pueden ser inesperados).

Entonces, cuando desee utilizar Date.parse en Firefox y Safari, debe tener cuidado. Para mí, utilizo un método de truco para lidiar con eso. (Nota: puede que no siempre sea correcto para todos los casos)

if (input.indexOf("UTC") != -1) {
  var tempInput = inputString.substr(0, 10) + "T" + inputString.substr(11, 8) + "Z";
  date = new Date(Date.parse(tempInput));
}

Aquí convierte primero 2013-08-08 11:52:18 UTC a 2013-08-08T11: 52: 18Z , y luego su formato se ajusta a las palabras del documento de Firefox. En este momento, Date.parse siempre estará a la derecha en cualquier navegador.

Haimei
fuente
0

Esto es en lo que funcionó para mí Firefoxy Chrome:

// The format is 'year-month-date hr:mins:seconds.milliseconds'
const d = new Date('2020-1-4 12:00:00.999') 
// we use the `.` separator between seconds and milliseconds.

Buena suerte...

Akash
fuente
-1

En Firefox, cualquier Fecha no válida se devuelve como un objeto Fecha como Fecha 1899-11-29T19:00:00.000Z, por lo tanto, verifique si el navegador es Firefox y luego obtenga el objeto Fecha de la cadena "1899-11-29T19:00:00.000Z".getDate(). Finalmente compárelo con la fecha.

Shahrukh Azeem
fuente
Esto no explica la causa del problema, sino más bien cuál sería el resultado del problema.
Rytis
-1

He utilizado el siguiente formato de fecha y funciona en todos los navegadores.

var target_date = new Date("Jul 17, 2015 16:55:22").getTime();

var days, hours, minutes, seconds;

var countdown = document.getElementById("countdown");

remaining = setInterval(function () {

    var current_date = new Date().getTime();
    var seconds_left = (target_date - current_date) / 1000;
    days = parseInt(seconds_left / 86400);
    seconds_left = seconds_left % 86400;
    hours = parseInt(seconds_left / 3600);
    seconds_left = seconds_left % 3600;
    minutes = parseInt(seconds_left / 60);
    seconds = parseInt(seconds_left % 60);
    countdown.innerHTML = "<b>"+days + " day, " + hours + " hour, "
        + minutes + " minute, " + seconds + " second.</b>";  
}, 1000);
umesh
fuente