Moment: Não foi possível encontrar a abreviação do fuso horário de Date.prototype.toString ()

Criado em 6 fev. 2012  ·  33Comentários  ·  Fonte: moment/moment

Olá. Encontrei o site moment.js através de um fórum e cliquei para acessá-lo, quando me deparei com o teste de unidade - que falhou em 2 testes o que desejo relatar aqui:

Agente de usuário:
Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit / 535.7 (KHTML, como Gecko) Chrome / 16.0.912.77 Safari / 535.7 (Chrome 16.0.912.77 m)

Fuso horário:
UTC + 1

Testes reprovados (# 28):
http://pastebin.com/bQsDuxdH

* Título editado por Timrwood

Bug

Comentários muito úteis

Pergunta estúpida: por que uma biblioteca inteiramente nova? O objetivo do Moment não é resolver todas as necessidades de gerenciamento de data e hora de alguém? Embora os arquivos de dados adicionem uma quantidade não trivial de espaço (e posso entender como separá-los), a nova biblioteca em si é <2k, portanto, o espaço não parece ser uma razão para separá-la.

Parece um pouco triste que alguém que simplesmente deseja gerar uma string de data com um fuso horário nela tenha que baixar duas bibliotecas separadas e um arquivo de dados para fazer o que o Javascript deveria ter embutido.

Além disso, como faço para usar esse novo amálgama de bibliotecas para gerar uma string de data simples? Antes que eu pudesse ter gerado:

Sun, 06 Nov 1994 08:49:37 GMT

com:

moment().format('ddd, DD MMM YYYY HH:mm:ss z');

Mas agora estou confuso sobre como devo fazer isso sem a opção de formatação "z". Qualquer ajuda seria apreciada.

Todos 33 comentários

Hmm, parece que a abreviatura do fuso horário está falhando. Desculpe fazer a depuração remota, mas qual é o resultado do seguinte no Chrome?

new Date().toString()

Além disso, qual é o nome do fuso horário em que você está?

Recebo o mesmo erro nos testes de unidade e também estou em UTC + 1 (anteriormente conhecido como GMT + 1).

new Date (). toString () imprime "Sáb 11 de fevereiro de 2012 02:15:10 GMT + 0100" no Firefox 10, "Sáb 11 de fevereiro de 2012 02:18:29 GMT + 0100 (Horário padrão da Europa Ocidental)" no Chrome 16 e "Sáb 11 de fevereiro 02:18:59 UTC + 0100 2012" no Internet Explorer 9

Hmm, eu estava com medo disso. O problema é que Date.prototype.toString retorna esses resultados diferentes. Esse é o único lugar para obter o nome do fuso horário (PST, CST, EST, etc.). Se esse método não estiver retornando nenhuma informação de fuso horário (como é o caso com FF10 e IE9, não há como obtê-lo.

Talvez seja hora de depreciar? Ou é aceitável apenas observar o problema nos documentos?

4318 aprovados, 2 reprovados. 2715 milissegundos.

Mozilla / 5.0 (Windows NT 6.1) AppleWebKit / 535.11 (KHTML, como Gecko) Chrome / 17.0.963.56 Safari / 535.11

UTC +2 (Kiev, Ucrânia)

formato de fuso horário 2 aprovado, 2 com falha.
---> Algo como "PST"
AssertionError: ---> Algo como "PST"
em Object.ok (http://momentjs.com/js/tests.js?_=120203_183019:1526:39)
em http://momentjs.com/js/tests.js?_=120203_183019:2413:14
em Object.runTest (http://momentjs.com/js/tests.js?_=120203_183019:1702:9)
em http://momentjs.com/js/tests.js?_=120203_183019:1748:25
em http://momentjs.com/js/tests.js?_=120203_183019:1006:13
em http://momentjs.com/js/tests.js?_=120203_183019:616:13
em http://momentjs.com/js/tests.js?_=120203_183019:627:25
em http://momentjs.com/js/tests.js?_=120203_183019:1008:17
em http://momentjs.com/js/tests.js?_=120203_183019:1589:17
---> Algo como "PST"
AssertionError: ---> Algo como "PST"
em Object.ok (http://momentjs.com/js/tests.js?_=120203_183019:1526:39)
em http://momentjs.com/js/tests.js?_=120203_183019:2414:14
em Object.runTest (http://momentjs.com/js/tests.js?_=120203_183019:1702:9)
em http://momentjs.com/js/tests.js?_=120203_183019:1748:25
em http://momentjs.com/js/tests.js?_=120203_183019:1006:13
em http://momentjs.com/js/tests.js?_=120203_183019:616:13
em http://momentjs.com/js/tests.js?_=120203_183019:627:25
em http://momentjs.com/js/tests.js?_=120203_183019:1008:17
em http://momentjs.com/js/tests.js?_=120203_183019:1589:17
+02: 00 ---> Algo como "+07: 30"
+0200 ---> Algo como "+0700"

Eu também recebo o mesmo teste de falha # 28. Meu fuso horário é GMT -3.

Agente:
Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit / 535.11 (KHTML, como Gecko) Chrome / 17.0.963.66 Safari / 535.11

Teste falhou: http://pastebin.com/dsWHMF3h

.:.

Agente:
Mozilla / 5.0 (Windows NT 6.1; WOW64; rv: 10.0.2) Gecko / 20100101 Firefox / 10.0.2
ou
Mozilla / 5.0 (compatível; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4. 0C; Zune 4.7; .NET4.0E)

Teste falhou: http://pastebin.com/6t6JP9fu

Portanto, parece que isso está acontecendo em UTC + 1, UTC + 2 e UTC-3.

Infelizmente, agora existe uma maneira de corrigir isso. Depende de hackear a saída Date().toString() , e se não houver informações de fuso horário disponíveis nessa string, não há como obter essas informações.

Vou depreciar esse recurso e talvez fazer um plug-in que tenha resultados mais confiáveis ​​(embora talvez menos precisos). Provavelmente deve ser algo como https://github.com/mde/timezone-js.

Os tokens z zz estão sendo descontinuados a partir de 1.6.0. Como resultado, estou encerrando este problema.

E o node.js? z zz confiáveis ​​ou não neste ambiente?

Eles foram oficialmente descontinuados, portanto não funcionarão a partir da versão 1.6.0.

Para versões de código anteriores, imagino que os resultados também seriam inconsistentes, já que o Node usa V8 e alguns dos resultados inconsistentes acima estão no Chrome, que também usa V8.

Obrigado. Então, para uma string como Thu Jan 10 2013 22:54:11 GMT+0100 (CET) , o que acabei fazendo é remover com uma regexp a string de fuso horário (aqui (CET) com o espaço inicial) e deixando apenas a informação do timeshift (aqui +0100 ). Você acha que é o suficiente para moment.js ou corro o risco de inconsistências?

Hmm, não tenho certeza do que você está tentando fazer, você está tentando obter CET ou +0100 ?

+0100 é compatível com o token ZZ (observe a capitalização) e funciona bem ao analisar e formatar.

CET foi descontinuado porque não podíamos obtê-lo com segurança de Date.toString . No entanto, como usamos Date.getTimezoneOffset para +0100 , o suporte é muito mais consistente.

Estou fazendo como você diz, usando ZZ para +0100 e removendo CET da string para analisar. Isso faz sentido ?

Minhas desculpas, ainda não estou entendendo qual é o problema aqui. Você está tentando analisar Thu Jan 10 2013 22:54:11 GMT+0100 (CET) ? Você deve ser capaz de apenas fazer o seguinte.

moment('Thu Jan 10 2013 22:54:11 GMT+0100 (CET)', 'ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');

Isso é exatamente o que estou fazendo no final. Parece que você está confirmando que estou fazendo a coisa certa. Minhas desculpas Se não fui claro, obrigado pelas respostas!

Sem problemas!

@ hughanderson4 , o problema era que os navegadores nem sempre retornavam uma abreviatura de fuso horário de Date.prototype.toString . Como não foi possível obter a abreviação do fuso horário de forma confiável, ele foi suspenso.

Desde então, o fuso horário do momento foi criado para adicionar suporte de fuso horário para moment.js. Você pode querer examinar isso para ver se ele atende às suas necessidades.

Como converter um moment.utc () para a hora local e exibir a abreviatura do fuso horário?

Pergunta estúpida: por que uma biblioteca inteiramente nova? O objetivo do Moment não é resolver todas as necessidades de gerenciamento de data e hora de alguém? Embora os arquivos de dados adicionem uma quantidade não trivial de espaço (e posso entender como separá-los), a nova biblioteca em si é <2k, portanto, o espaço não parece ser uma razão para separá-la.

Parece um pouco triste que alguém que simplesmente deseja gerar uma string de data com um fuso horário nela tenha que baixar duas bibliotecas separadas e um arquivo de dados para fazer o que o Javascript deveria ter embutido.

Além disso, como faço para usar esse novo amálgama de bibliotecas para gerar uma string de data simples? Antes que eu pudesse ter gerado:

Sun, 06 Nov 1994 08:49:37 GMT

com:

moment().format('ddd, DD MMM YYYY HH:mm:ss z');

Mas agora estou confuso sobre como devo fazer isso sem a opção de formatação "z". Qualquer ajuda seria apreciada.

Então, perguntando apenas para ter certeza de que entendi: não há substituto para o obsoleto formato 'z'?

Se eu tiver um carimbo de data / hora no formato ISO-8601, como:

2014-07-25T18:00:00-04:00

E eu quero exibir esse carimbo de data / hora da seguinte forma:

6:00 PM EST

Momento não suporta mais esta formatação? Todos os dados de fuso horário estão incluídos em meu carimbo de data / hora e desejo apenas exibi-los diretamente, sem transformar o fuso horário de forma alguma.

Isso não inclui o fuso horário. Pode haver vários nomes de fuso horário que correspondem ao mesmo deslocamento UTC, especialmente ao considerar as possibilidades de variação do horário de verão. Você não pode inferir de "UTC-4: 00" que o fuso horário é EST.

Para esclarecimento, o formatador z ainda funciona ao usar fuso horário de momento com um

Basta mencionar isso agora - se você usar
new Date().toTimeString()
você obtém o mesmo resultado em todos os navegadores, tanto quanto tentei.

Isso significa que você poderia usar essa string para extrair o fuso horário, não?

Olá, vejo acima que o formato ('z') está obsoleto. também na documentação do momento, vejo que foi preterido do 1.6.0. Estou usando 2.11.0 agora, posso usar o 'z' para exibir o fuso horário (PST / PDT) com base no deslocamento.
Não devo usar este 'z' no meu código agora? você pode dizer a alternativa exata para exibir PST em vez de - / + 8

@themakshter - não, você não obtém o mesmo resultado em todos os navegadores. O sistema operacional, a versão do navegador e o idioma influenciam fortemente - e não há requisitos de consistência nas especificações.

@ Shobana16 - Se você apenas fizer moment().format('z') , sempre retornará "" .

Se você estiver usando o fuso horário de momento e fizer algo como moment.tz('America/Los_Angeles').format('z') , receberá uma resposta válida.

z está bem com fuso horário. Não faz nada em um momento normal.

Obrigado pelos comentários MJ. Sim, estou usando 'z' apenas com fuso horário. Ok legal continuará meu código com 'z'. !

Apenas uma nota para adicionar, a partir do fuso horário 0.5.0, você pode _adivinhar_ o fuso horário local, o que abre a porta para:

var abbreviation = moment.tz(moment.tz.guess()).format('z');

Não tem problema, mas esteja ciente de que:

  1. É apenas um palpite. Pode adivinhar errado.
  2. Se errar, ainda há a possibilidade de que a abreviatura esteja correta, já que muitos fusos horários semelhantes usarão as mesmas abreviações, como Europe/Paris e Europe/Berlin ambos usam CET e CEST .
  3. No entanto, não há garantias. Se acertar errado, você pode apresentar a abreviatura errada.

Também podemos considerar adaptar o moment.js de forma que, se o fuso horário do momento estiver disponível, ele possa tentar fazer isso automaticamente para reativar o formatador z . Embora isso não esteja acontecendo atualmente.

var abbreviation = moment.tz(moment.tz.guess()).format('zz'); não parece funcionar (com dois z s). Só consigo recuperar "EDT" e não "Eastern Daylight Time"?

Obrigado!

Ahhh, descobri que http://momentjs.com/timezone/docs/#/using -timezones / formatting / diz: Para fornecer nomes longos, você pode substituir moment.fn.zoneName e usar o zz token.
[and much more...]
Obrigado.

Porém, uma coisa é confusa. Na versão atual (ou como é afirmado "a partir de 1.6.0 ") não há como mostrar o fuso horário sem usar o fuso horário separado. Mas quando faço moment(...).toString() ele mostra, por exemplo, GMT no final. Então, é um bug ou uma solução contradiz outra funcionalidade?

Porém, uma coisa é confusa. Na versão atual (ou como é afirmado "a partir de 1.6.0 ") não há como mostrar o fuso horário sem usar o fuso horário separado. Mas quando faço moment(...).toString() ele mostra, por exemplo, GMT no final. Então, é um bug ou uma solução contradiz outra funcionalidade?

Acho que o problema é a confiabilidade. O Moment não pode extrair com segurança o fuso horário correto do objeto de data local, portanto, ele não suporta mais z/zz em sua formatação.

Discutido acima:
https://github.com/moment/moment/issues/162#issuecomment -4060027

Foi isso que funcionou para nós obtermos o texto "GMT", uma vez que z foi descontinuado

const dateGenerated = moment("2020-05-20 08:15:25");
const localDateGenerated = dateGenerated.local().format('DD MMM YYYY hh:mm A') + ' ' + String(dateGenerated.local()._d).split(' ')[5];

Ele irá gerar 20 May 2020 08:15 AM GMT+0300"

Esta página foi útil?
0 / 5 - 0 avaliações