new Date () funciona de maneira diferente no Chrome e Firefox

94

Desejo converter a sequência de datas em Datejavascript, use este código:

var date = new Date('2013-02-27T17:00:00');
alert(date);

'2013-02-27T17:00:00' é a hora UTC no objeto JSON do servidor.

Mas o resultado do código acima é diferente entre o Firefox e o Chrome:

O Firefox retorna:

Wed Feb 27 2013 17:00:00 GMT+0700 (SE Asia Standard Time)

O Chrome retorna:

Thu Feb 28 2013 00:00:00 GMT+0700 (SE Asia Standard Time) 

É diferente 1 dia, o resultado correto que eu esperaria é o resultado do Chrome.

Código de demonstração: http://jsfiddle.net/xHtqa/2/

Como posso corrigir esse problema para obter o mesmo resultado de ambos?

cuongle
fonte
2
Isso está no mesmo computador?
Aaron Digulla
4
@Sandeep, o ponto principal é que o Chrome adiciona deslocamento de fuso horário, enquanto o Firefox não
localidade padrão
3
@CuongLe Você viu esta questão: stackoverflow.com/questions/9062863/…
localidade padrão
1
É Date {Wed Feb 27 2013 17:00:00 GMT+0000 (GMT)}para mim em ambos (Linux).
marekful
1
Canto de Nitpicker: «hora UTC no formato JSON» - formato JSON? Precisamente, uma reclamação comum sobre JSON é que ele não define nenhum formato de data.
Álvaro González

Respostas:

66

O formato correto para UTC seria 2013-02-27T17:00:00Z(Z é para Zulu Time). Anexar Zse não estiver presente para obter a string de data e hora UTC correta.

Petr Abdulin
fonte
2
Obrigado. Isso funciona. Mas há um log dizendo, ele será descontinuado no futuro !!!. Alguma ideia, por favor?
Débora
1
muito obrigado, estive sentado com esse problema por dois dias, mas este post resolveu tudo.
Piyal George
30

Sim, infelizmente, os algoritmos de análise de data dependem da implementação. Da especificação deDate.parse (que é usada por new Date):

A String pode ser interpretada como uma hora local, uma hora UTC ou uma hora em algum outro fuso horário, dependendo do conteúdo da String. A função primeiro tenta analisar o formato da String de acordo com as regras apresentadas em Date Time String Format ( 15.9.1.15 ). Se a String não estiver em conformidade com esse formato, a função pode recorrer a qualquer heurística específica de implementação ou formatos de data específicos de implementação.

Para fazer com que o Dateconstrutor não (talvez) use o fuso horário local, use uma string de data e hora com informações de fuso horário, por exemplo "2013-02-27T17:00:00Z". No entanto, é difícil encontrar um formato que seja confiável analisado por todos os navegadores - o formato ISO não é reconhecido pelo IE <8 (consulte JavaScript: quais navegadores suportam a análise de string de data ISO-8601 com Date.parse ). Melhor, use um carimbo de data / hora unix, ou seja, milissegundos desde a época unix , ou use uma expressão regular para quebrar a string em suas partes e alimentá-las Date.UTC.

Bergi
fonte
2
Mas a especificação (15.9.1.15) realmente diz: "O valor de um deslocamento de fuso horário ausente é“ Z ”" - portanto, NÃO deve ser dependente da implementação
sinelaw
12
OK, correção. Parece um erro na especificação ES5.1 - a intenção era corresponder ao ISO-8601, onde Z ausente significa hora local (então o Chrome corresponde ao ES5.1, o Firefox e o IE correspondem ao ISO-8601)
sinelaw
@sinelaw: Obrigado por investigar melhor esse ponto. No entanto, independentemente do que as especificações indicam, os navegadores [antigos] ainda estão fazendo isso de maneira diferente :-)
Bergi
2
Estranhamente, usar Date.Parse vs. new Date corrigiu o problema que eu estava tendo, onde o Chrome convertia a data para o fuso horário local em vez de tratá-la como já no fuso horário local.
KingOfHypocrites
1
@ KingOfHypocrites — isso é um pouco estranho, pois chamar o construtor Date com uma string é supostamente o mesmo que usar Date.parse .
RobG
4

Eu encontrei uma coisa aqui. Parece que o Firefox Inspector Console nativo pode ter um bug: se eu executar "new Date ()" no Inspector nativo, ele mostra uma data com fuso horário incorreto, local do GMT, mas executando o mesmo comando no Firebug Extension Console, a data mostrado usa meu fuso horário correto (GMT-3: 00).

Sergio Abreu
fonte
-2

Tente usar moment.js. Vai muito bem e de forma semelhante em todos os navegadores. vem com muitas opções de formatação. use o momento ('data'). formato ("") em vez de Nova data ('data')

MSIslam
fonte
-2

Percebi que o FireFox não estava retornando o mesmo resultado do Chrome. Parece que o formato que você usa em kendo.toString para data faz diferença.

O último resultado do console é o que eu precisava:

insira a descrição da imagem aqui

MJ Storm
fonte