Moment: startOf('day')/endOf('day') não está correto com UTC

Criado em 24 jan. 2014  ·  3Comentários  ·  Fonte: moment/moment

Ao usar a hora local, a função startOf('day')/endOf('day') funciona como esperado, mas quando eu uso a hora UTC o valor é tratado como a hora local.

http://jsfiddle.net/3d9eU/5/

momento.lang('nl');
var t1 = momento(); // horário local
var t2 = t1.clone().utc(); // UTC

console.log('LOC valueOf = ' + t1.valueOf()); //1390557395517 -> OK
console.log('UTC valueOf = ' + t2.valueOf()); // 1390557395517 -> OK

console.log('LOC final do dia valueOf = ' + t1.endOf('day').valueOf()); //1390604399999 -> OK
console.log('UTC final do dia valueOf = ' + t2.endOf('day').valueOf()); //1390607999999 -> NÃO OK

console.log('LOC fim do dia _d = ' + t1.endOf('dia')._d); //Sex, 24 de janeiro de 2014 23:59:59 GMT+0100 (Horário padrão da Europa Ocidental) -> OK
console.log('UTC final do dia _d = ' + t2.endOf('dia')._d); //Sáb 25 de janeiro de 2014 00:59:59 GMT+0100 (Horário padrão da Europa Ocidental) -> NÃO OK

Atenciosamente,
Björn

Troubleshooting

Comentários muito úteis

Parece que você está perguntando por que m.utc().endOf('day') lhe dá o final do dia em UTC em vez de em seu horário local. Isso é por design. utc() significa "trate a hora como se fosse UTC", onde o final do dia é 23:59:59 _em UTC_, que é uma hora mais tarde na Europa Ocidental. É o mesmo que offset() funciona; uma vez que o momento está em um certo deslocamento UTC, suas operações funcionam nesse contexto.

Em outras palavras, eles dizem coisas muito diferentes (estou na costa leste dos EUA):

moment().utc().endOf('day').toString(); //=> "Sat Jan 25 2014 23:59:59 GMT+0000"
moment().endOf('day').utc().toString(); //=> "Sun Jan 26 2014 04:59:59 GMT+0000"

Espero que isso ajude.

Todos 3 comentários

Que versão do Moment é essa? d não é uma propriedade no objeto Moment (pelo menos, mais). Há um _d , que você definitivamente não deve fazer referência e que seria extremamente enganoso aqui. Quanto ao problema real, funciona bem para mim:

moment().utc().endOf('day').format(); //=> '2014-01-24T23:59:59+00:00'

Então eu estou supondo que você está em uma versão pré-histórica?

Estou usando a versão 2.5.0.

A propriedade '_d' é o que eu uso para ver qual valor o Moment contém durante a depuração. (Desculpe pelo mal entendido). Mas por que essa propriedade é diferente para hora local versus UTC? Ambos têm fuso horário +0100 em vez de +0100 para hora local e +0000 para UTC. veja http://jsfiddle.net/3d9eU/5/

Hora local: sexta-feira, 24 de janeiro de 2014, 23:59:59 GMT+0100 (horário padrão da Europa Ocidental)
UTC: Sáb 25 de janeiro de 2014 00:59:59 GMT+0100 (W. Europe Standard Time) não deveria ser Sex Jan 24 2014 23:59:59 GMT+0100 (W. Europe Standard Time) com propriedade _isUTC = true ?

Parece que você está perguntando por que m.utc().endOf('day') lhe dá o final do dia em UTC em vez de em seu horário local. Isso é por design. utc() significa "trate a hora como se fosse UTC", onde o final do dia é 23:59:59 _em UTC_, que é uma hora mais tarde na Europa Ocidental. É o mesmo que offset() funciona; uma vez que o momento está em um certo deslocamento UTC, suas operações funcionam nesse contexto.

Em outras palavras, eles dizem coisas muito diferentes (estou na costa leste dos EUA):

moment().utc().endOf('day').toString(); //=> "Sat Jan 25 2014 23:59:59 GMT+0000"
moment().endOf('day').utc().toString(); //=> "Sun Jan 26 2014 04:59:59 GMT+0000"

Espero que isso ajude.

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