Estou criando uma string de data e hora parecida com esta: 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 cromo está funcionando bem, qual seria a causa principal?
javascript
google-chrome
date
datetime
firefox
Pixeldev
fonte
fonte
Respostas:
Você não pode instanciar um objeto de data da maneira que quiser. Tem que ser de uma maneira específica. Aqui estão alguns exemplos válidos:
ou
O Chrome deve ser apenas mais flexível.
Fonte: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
Do comentário de apsillers :
a especificação EMCAScript requer exatamente um formato de data (ou seja, AAAA-MM-DDTHH: mm: ss.sssZ), mas os formatos de data personalizados podem ser suportados gratuitamente por uma implementação : " Se a string não estiver em conformidade com esse formato [definido por ECMAScript] a função pode recorrer a qualquer heurística específica de implementação ou formatos de data específicos de implementação. "Chrome e FF simplesmente têm diferentes" formatos de data específicos de implementação. "
fonte
YYYY-MM-DDTHH:mm:ss.sssZ
) , mas os formatos de data personalizados podem ser suportados gratuitamente por uma implementação : " Se a String não estiver em conformidade com esse formato [definido pelo ECMAScript], a função pode recorrer a qualquer heurística específica de implementação ou formatos de data específicos de implementação. "Chrome e FF simplesmente têm diferentes" formatos de data específicos de implementação. "Isso funciona em todos os navegadores -
Formato: AAAA-MM-DDTHH: mm: ss.sss
Detalhes: http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
fonte
Opção 1 :
Suponha que sua sequência de tempo tenha um formato parecido com este:
Nesse caso, você poderia fazer um regex simples para convertê-lo em
ISO 8601
:Isso produziria a seguinte saída:
Este é o formato datetime padrão e, portanto, compatível com todos os navegadores:
Opção 2 :
Suponha que sua sequência de tempo tenha um formato parecido com este:
Aqui, você pode fazer o seguinte regex:
Isso também produz um formato compatível com todos os navegadores:
Opção 3:
Suponha que você tenha uma sequência de tempo que não seja fácil de ajustar a um dos padrões bem suportados.
Nesse caso, é melhor apenas dividir sua sequência de tempo em partes diferentes e usá-las como parâmetros individuais para
Date
:fonte
Isso funciona na maioria dos navegadores também
Esse é o formato de
fonte
Se você ainda deseja criar a data usando travessões, pode usar este formato:
Mas tenha em mente que ele cria o tempo de acordo com o UTC. Ou seja, se você mora no fuso horário GMT + 3 (3 horas antes do GMT), ele adicionará essa diferença de fuso horário ao horário. Portanto, o exemplo acima terá este valor, se GMT + 3 (observe que é hora 20:00 e não 17:00):
Certifique-se de adicionar a letra 'Z' no final, porque caso contrário, o Chrome e o Firefox irão analisar a string de forma diferente (um adicionará a diferença de tempo e o outro não).
fonte
Eu estava tendo um problema semelhante no Firefox e no Safari ao trabalhar com o AngularJS. Por exemplo, se uma data retornada do Angular for assim:
usando este código:
retorna um erro de data inválida no Firefox e Safari. No entanto, no Chrome funciona bem. Como outra resposta afirmou, o Chrome é provavelmente apenas mais flexível com a análise de strings de data.
Meu objetivo final era formatar a data de uma certa maneira. Encontrei uma excelente biblioteca que lida 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:
Se você deseja incluir esta biblioteca extra em seu aplicativo, você pode construir mais facilmente sua string de data, evitando possíveis problemas de compatibilidade do navegador. Como bônus, você terá uma boa maneira de formatar, adicionar, subtrair, etc. datas, se necessário.
fonte
Isso deve funcionar para você:
Tive que criar uma data a partir de uma string, então fiz assim:
Lembre-se de que os meses em javascript vão de 0 a 11, então você deve reduzir o valor do mês em 1, assim:
fonte
Solução simples, que funciona com todos os navegadores,
fonte
Uma situação que encontrei foi ao lidar com milissegundos. O FF e o 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.177Z
. No entanto, o Chrome funcionará.fonte
Na verdade, o Chrome é mais flexível para lidar com diferentes formatos de string. Mesmo que você não descubra seu formato de String, o Chrome ainda pode converter String em Data sem erros. Como isso:
Mas para Firefox e Safari, as coisas se tornam mais complexas. Na verdade, no documento do Firefox, já diz: ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse )
Portanto, quando quiser usar Date.parse no Firefox e Safari, você deve ter cuidado. Para mim, uso um método de truque para lidar com isso. (Nota: pode não ser sempre correto para todos os casos)
Aqui, ele converte 2013-08-08 11:52:18 UTC para 2013-08-08T11: 52: 18Z primeiro e, em seguida, seu formato é adequado para palavras no documento do Firefox. Neste momento, Date.parse estará sempre correto em qualquer navegador.
fonte
Isso é o que funcionou para mim em
Firefox
eChrome
:Boa sorte...
fonte
No Firefox, qualquer Date inválido é retornado como um objeto Date como Date
1899-11-29T19:00:00.000Z
, portanto, verifique se o navegador é Firefox e obtenha o objeto Date da string"1899-11-29T19:00:00.000Z".getDate()
. Finalmente compare com a data.fonte
Usei o seguinte formato de data e está funcionando em todos os navegadores.
fonte