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?


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.


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.


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


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


-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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.