Moment: Confusão sobre moment.utz com MySQL DateTime

Criado em 18 abr. 2016  ·  3Comentários  ·  Fonte: moment/moment

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?

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:

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 /

Todos 3 comentários

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:

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