new Date () está funcionando no Chrome, mas não no Firefox

Eu estou criando uma seqüência de caracteres de data e hora que se parece com isso: 2010-07-15 11:54:21

E com o seguinte código, recebo uma data inválida no Firefox, mas funciona bem no Chrome

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

No firefox date1 está me dando uma data inválida, mas no chrome está funcionando bem, qual seria a causa principal?

Você não pode instanciar um object de data da maneira que quiser. Tem que ser de uma maneira específica. Aqui estão alguns exemplos 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) 

ou

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

O Chrome deve ser mais flexível.

Fonte: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Date

Do comentário de apsillers :

a especificação do EMCAScript requer exatamente um formato de data (por exemplo, AAAA-MM-DDTHH: mm: ss.sssZ), mas formatos de data personalizados podem ser livremente suportados por uma implementação : ” Se o String não estiver em conformidade com esse formato [ECMAScript-defined] a function pode retornar a qualquer heurística específica da implementação ou formatos de data específicos da implementação. “O Chrome e o FF simplesmente têm diferentes formatos de datas específicos da implementação”.

Isso funciona em todos os navegadores –

nova data (‘2001/01/31 12:00:00 AM’)

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

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

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

Isso funciona na maioria dos navegadores também

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

Esse é o formato de

 "yyyy/MM/dd HH:mm:ss" 

Opção 1 :

Suponha que o seu timestring tenha um formato assim:

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

Nesse caso, você poderia fazer um regex simples para convertê-lo em ISO 8601 :

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

Isso produziria a seguinte saída:

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

Este é o formato de data e hora padrão e, portanto, suportado por todos os navegadores:

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

Se você ainda quiser criar uma data usando traços, poderá usar este formato:

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

Mas tenha em mente que isso cria tempo de acordo com a UTC. Ou seja, se você mora no fuso horário GMT + 3 (3 horas à frente do GMT), ele adicionará esse deslocamento de fuso horário ao horário. Portanto, o exemplo acima terá esse valor, se GMT + 3 (observe que é hora 20:00 e não 17:00):

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

Certifique-se de adicionar a letra ‘Z’ no final, porque senão o Chrome e o Firefox analisarão a string de maneira diferente (um adicionará o deslocamento de tempo e o outro não).

Eu estava tendo um problema semelhante no Firefox e no Safari ao trabalhar com o AngularJS. Por exemplo, se uma data retornada do Angular tivesse esta aparência:

 2014-06-02 10:28:00 

usando este código:

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

retorna um erro de data inválido no Firefox e no Safari. No entanto, no Chrome, funciona bem. Como outra resposta afirmou, é mais provável que o Chrome seja mais flexível ao analisar as strings de data.

Meu objective final era formatar a data de uma determinada maneira. Eu encontrei uma excelente biblioteca que lidou com o problema de compatibilidade entre navegadores e o problema de formatação de data. A biblioteca é chamada moment.js .

Usando esta biblioteca, o código a seguir funciona corretamente em todos os navegadores que testei:

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

Se você estiver disposto a include essa biblioteca extra no seu aplicativo, poderá criar sua sequência de datas mais facilmente, evitando possíveis problemas de compatibilidade do navegador. Como bônus, você terá uma boa maneira de facilmente formatar, adicionar, subtrair, etc., se necessário.

Isso deve funcionar para você:

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

Eu tive que criar data forma uma string então eu fiz assim:

 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)); 

Lembre-se que os meses em javascript são de 0 a 11, então você deve reduzir o valor do mês em 1, assim:

 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)); 

Uma situação em que me deparei foi ao lidar com milissegundos. FF e IE não analisarão essa string de data corretamente ao tentar criar uma nova data. "2014/11/24 17:38:20.177Z" Eles não sabem como lidar com .177Z . O Chrome funcionará.

Na verdade, o Chrome é mais flexível para lidar com diferentes formatos de string. Mesmo que você não descubra seu formato String, o Google Chrome ainda poderá converter com êxito String to Date sem erros. Como isso:

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

Mas para o Firefox e o Safari, as coisas se tornam mais complexas. De fato, no documento do Firefox, ele já diz: ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse )

Uma string representando uma data RFC2822 ou ISO 8601 (outros formatos podem ser usados, mas os resultados podem ser inesperados).

Então, quando você quiser usar o Date.parse no Firefox e no Safari, você deve ser cuidadoso. Para mim, eu uso um truque para lidar com isso. (Nota: pode não ser sempre correto para todos os casos)

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

Aqui liga 2013-08-08 11:52:18 UTC para 2013-08-08T11: 52: 18Z primeiro, e então seu formato é palavras adequadas no documento do Firefox. Neste momento, Date.parse estará sempre certo em qualquer navegador.

Solução simples, isso funciona com todos os navegadores,

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

No Firefox, qualquer Data inválida é retornada como um object Date como Data 1899-11-29T19:00:00.000Z , portanto, verifique se o navegador é Firefox, então, pegue o object Date da string "1899-11-29T19:00:00.000Z".getDate() . Finalmente compare com a data.

Eu usei o seguinte formato de data e está funcionando em todos os 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 = ""+days + " day, " + hours + " hour, " + minutes + " minute, " + seconds + " second."; }, 1000);