Descrição do problema e etapas para reproduzir:
Digamos que eu tenha recebido uma data do back-end neste formato:
"2018-10-10T13:00:00+11:00"
O que espero ver no frontend após a análise e a formatação:
10-10-2018 1.00 PM
O que eu tenho:
10-10-2018 5.00 AM
Eu não me importo com o fuso horário do meu sistema. Também não quero ver a hora UTC. Como posso alcançá-lo?
Por favor, inclua os valores de todas as variáveis usadas.
Veja acima.
Meio Ambiente:
Não importa, não deve depender do ambiente. Esse é o problema, aliás, porque depende!
Afaik, o momento usa como padrão o fuso horário do dispositivo ao formatar uma data (que também é o comportamento padrão do Javascript). Então sim, a formatação de uma data deve depender do ambiente. Por exemplo, no meu dispositivo, recebo isso para sua data, que é a hora correta para minha hora local (Auckland):
moment("2018-10-10T13:00:00+11:00").format()
// => '2018-10-10T15:00:00+13:00'
Se você deseja definir manualmente um fuso horário padrão para o usuário, pode usar moment-timezone
com um nome de fuso horário IANA :
moment.tz.setDefault('America/New_York');
Isso fará com que toda a formatação seja feita para esse fuso horário e seja independente do ambiente.
Aqui está um link para os documentos: https://momentjs.com/timezone/docs/#/using -timezones/default-timezone/
Não é possível descobrir o fuso horário do usuário a partir do deslocamento (porque vários fusos horários podem compartilhar o mesmo deslocamento, por exemplo, dependendo do horário de verão), mas você pode usar os nomes de zona Etc
para zonas "genéricas", por exemplo, Etc/GMT-11
no seu caso (o sinal é invertido para essas zonas). No seu caso, provavelmente faria mais sentido armazenar o fuso horário do usuário como uma configuração e mantê-lo no servidor ou salvá-lo junto com o carimbo de data/hora.
Então você pode imprimir uma única data em um determinado fuso horário usando, por exemplo,
moment.tz("2018-10-10T13:00:00+11:00", "America/New_York");
Obrigado, @simonhaenisch
Eu vi o plugin tz, mas achei que ajuda a gerenciar fusos horários, como converter de um para outro . E parece estranho para mim usá-lo apenas para NÃO tocar no fuso horário :)
Se você deseja definir um fuso horário padrão para o usuário manualmente
Infelizmente, não há um fuso horário default
no servidor. Cada usuário tem seu próprio fuso horário, salvo no perfil. E o frontend não sabe nada sobre isso.
Não é possível descobrir o fuso horário do usuário a partir do deslocamento
Tudo bem, eu não me importo com o fuso horário. Tudo que eu preciso é apenas manter a próxima data sem alterações.
armazene o fuso horário do usuário como uma configuração e o mantenha no servidor ou salve-o junto com o carimbo de data/hora.
Isso é exatamente o que está acontecendo. O fuso horário é uma configuração e a data salva com ele como um carimbo de data/hora.
Como a API de back-end está sob meu controle, posso enviar apenas uma versão reduzida da data, sem deslocamento de fuso horário. Espero que ajude.
Mas, é realmente interessante porque o moment.js não tem algo assim:
moment(somDateTime).format({ formatWithDeviceTimezone: true })
ou tipo :)
Onde formatWithDeviceTimezone
é falso por padrão.
De qualquer forma, obrigado, agora eu vejo o problema.
Você pode tentar parseZone
:
por exemplo, para um fuso horário local em BST (UTC + 1)
moment.parseZone("2018-10-10T13:00:00+11:00").format(); // "2018-10-10T13:00:00+11:00"
moment.parseZone("2018-10-10T13:00:00+11:00").local().format(); // "2018-10-10T03:00:00+01:00"
moment.parseZone("2018-10-10T13:00:00+11:00").utc().format(); // "2018-10-10T02:00:00Z"
Comentários muito úteis
Você pode tentar
parseZone
:por exemplo, para um fuso horário local em BST (UTC + 1)