Estou tentando passar as duas strings de data para new Date(t)
.
Espero que ambas as strings representem a mesma hora, afinal, se omitir a hora, não deveria ser meia-noite desse dia?
Mas enquanto,
new Date("2016-02-16 00:00")
retorna 2016-02-16, meia-noite, hora local conforme esperado,
new Date("2016-02-16")
retorna 2016-02-16, meia-noite UTC, o que está errado, ou pelo menos não o que eu esperava, dado como a outra string analisa.
Eu entenderia se ambos tivessem o mesmo comportamento, seja para retornar a hora como hora local ou como UTC, mas parece muito inconsistente porque eles retornam coisas diferentes como esta.
Como solução alternativa, sempre que encontro uma data que não tem um carimbo de data / hora correspondente, posso acrescentar "00:00" para obter um comportamento consistente, mas parece que isso é bastante frágil.
Estou obtendo esse valor de um elemento INPUT, do tipo 'datetime-local', portanto, parece especialmente inconsistente que tenho que solucionar um valor retornado por um elemento de página.
Estou fazendo algo errado ou deveria fazer algo diferente?
fonte
2016-02-16 00:00
- este não parece ser o tempo válido. ecma-international.org/ecma-262/6.0/… , mas mesmo depois de colocáT
-lo lá, ele realmente se comporta de maneira diferenteRespostas:
É o que a especificação ES5.1 diz para fazer:
Também diz:
Como o formato requer um
T
separador entre a data e a hora, os horários válidos vão para UTC:... enquanto em node.js, uma hora inválida (sem o separador T) parece ir para a hora local específica da implementação:
Observe que o ES6 mudou isso, na mesma parte da documentação ele muda para:
A alegria de quebrar mudanças .
Editar
De acordo com TC39 , a especificação deve ser interpretada como strings de data e hora sem fuso horário (por exemplo, "2016-02-16T00: 00: 00") são tratadas como locais (de acordo com ISO 8601), mas apenas strings de data (por exemplo "2016-02-16") como UTC (que é inconsistente com ISO 8601).
fonte
De acordo com as especificações :
E os formatos de string de data e hora aceitam
2016-02-16
como uma data válidaAssim se
2016-02-16
traduz em2016-02-16T00:00:00.000Z
.A outra data
2016-02-16 00:00
não está em conformidade com o formato e, portanto, sua análise é específica da implementação. Aparentemente, essas datas são tratadas como tendo fuso horário local e sua data de exemplo retornará valores diferentes dependendo do fuso horário:Resumo:
NaN
vez de tentar analisar datas não conformes. Basta testar seu código no Internet Explorer 11;)fonte
Talvez você esteja encontrando diferenças entre as implementações ES5, ES6 e o resultado esperado. Por Date.parse at MDN, "especialmente em diferentes implementações ECMAScript onde strings como" 2015-10-12 12:00:00 "podem ser analisadas como NaN, UTC ou fuso horário local" é significativo.
Testes adicionais no Firefox 44 e no IE 11 revelaram que ambos retornam um objeto de data para
new Date("2016-02-16 00:00")
, cujo objeto retorna NaN ao tentar obter um valor de componente de data e cujo valor toString é "Data inválida" (não "NaN"). Portanto, acrescentar "00:00 para obter um comportamento consistente" pode facilmente quebrar em diferentes navegadores.Conforme observado em outras respostas,
new Date("2016-02-16")
usa um deslocamento de fuso horário de zero por padrão, produzindo UTC da meia-noite em vez de local.fonte
De acordo
DateParser::Parse()
com os códigos-fonte V8 do Chrome.fonte
Ele adiciona a diferença de fuso horário ao
00:00
new Date("2016-02-16")
saídasTue Feb 16 2016 05:30:00 GMT+0530 (India Standard Time)
Meu fuso horário sendo IST com um valor de deslocamento (em minutos)
+330
, então ele adicionou 330 minutos a 00:00.Conforme ecma-262, seção 20.3.3.2 Date.parse (string)
Quando você definir explicitamente as unidades de tempo,
new Date("2016-02-16 00:00")
ele usará definir isso comohours
eminutes
,Caso contrário, conforme indicado aqui em 2 0.3.1.16
fonte
section 20.3.3.2
The String may be interpreted as a local time, a UTC time, or a time in some other time zone, depending on the contents of the String.
Onde está afirmando que deve ser o mesmo?