Moment: É possível manter o fuso horário do back-end?

Criado em 4 out. 2018  ·  3Comentários  ·  Fonte: moment/moment

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!

Comentários muito úteis

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"

Todos 3 comentários

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"
Esta página foi útil?
0 / 5 - 0 avaliações