Escrevi um pequeno teste aqui: https://jsfiddle.net/vrdhcuey/1/
Quando solicitamos do banco de dados, obtemos um DATETIME do banco de dados MySQL de volta (inicialmente definido para o fuso horário UTC padrão, mas também testado com ele definido como Europa / Dublin como fuso horário) de 2016-04-22T16:00:00.000Z
- ou seja, o datetime final do nosso objeto é sexta-feira, 22 de abril, às 16h. Na realidade, não há fuso horário, pois tudo o que estamos dizendo é que o evento pode terminar às 16h em uma determinada data, mas essa data pode cair em GMT ou BST.
No teste fornecido, queremos obter a duração entre agora e essa data e hora. No entanto, é sempre uma hora de folga. A única maneira de contornar isso é remover .000Z
do final da string de data e hora. Também tentei usar moment.tz, mas obtive o mesmo resultado (ou seja, neste teste leftTime4 é o comportamento correto que esperávamos). No entanto, eu esperava que o leftTime2 funcionasse como está.
Alguém pode esclarecer esta confusão ou estou encontrando um bug aqui?
O padrão ISO8601 especifica que as datas que terminam em Z devem ser interpretadas como UTC. Como tal, o momento em que passa a sua hora converte a hora UTC para a hora local. É assim que você consegue sua situação de folga de uma hora.
Se você deseja ignorar o Z por um momento (interpretar a hora como local), você pode especificar um formato que não pegue no Z fazendo o seguinte:
moment('2016-04-22T16:00:00.000Z', 'YYYY-MM-DDTHH:mm:ss.SSS').format()
Se você deseja obter mais informações sobre os vários modos de análise, esta seção dos guias pode ser útil: http://momentjs.com/guides/#/parsing/local -utc-zone /
Certo - então, a verdadeira correção é: não emita Z
de seu back-end se você realmente não quer dizer UTC.
@ mj1856 Sim, tentei, mas me pergunto se o problema está no Sequlize, e não no próprio MySQL - quando executamos a consulta no banco de dados diretamente, ele emite apenas um DATETIME simples com AAAA-MM-DD HH: MM: SS, conforme está armazenado . Alterar o fuso horário do DB parecia não fazer diferença. De qualquer forma, o acima parece consertar por agora, veremos se ele se mantém quando voltarmos para o GMT: bomba:
Comentários muito úteis
O padrão ISO8601 especifica que as datas que terminam em Z devem ser interpretadas como UTC. Como tal, o momento em que passa a sua hora converte a hora UTC para a hora local. É assim que você consegue sua situação de folga de uma hora.
Se você deseja ignorar o Z por um momento (interpretar a hora como local), você pode especificar um formato que não pegue no Z fazendo o seguinte:
Se você deseja obter mais informações sobre os vários modos de análise, esta seção dos guias pode ser útil: http://momentjs.com/guides/#/parsing/local -utc-zone /