Moment: startOf('день')/endOf('день') неправильно с UTC

Созданный на 24 янв. 2014  ·  3Комментарии  ·  Источник: moment/moment

При использовании местного времени функция startOf('day')/endOf('day') работает как положено, но когда я использую время UTC, значение обрабатывается как местное время.

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

момент.lang('nl');
вар t1 = момент(); // местное время
var t2 = t1.clone().utc(); // УНИВЕРСАЛЬНОЕ ГЛОБАЛЬНОЕ ВРЕМЯ

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

console.log('LOC конец дня valueOf = ' + t1.endOf('day').valueOf()); //1390604399999 -> ОК
console.log('Конец дня UTC valueOf = ' + t2.endOf('day').valueOf()); //1390607999999 -> НЕ ОК

console.log('LOC конец дня _d = ' + t1.endOf('день')._d); //Пт, 24 января 2014 г., 23:59:59 GMT+0100 (стандартное время Западной Европы) -> OK
console.log('Конец дня UTC _d = ' + t2.endOf('день')._d); // Сб, 25 января 2014 г., 00:59:59 GMT+0100 (стандартное время Западной Европы) -> НЕ ОК

С наилучшими пожеланиями,
Бьёрн

Troubleshooting

Самый полезный комментарий

Похоже, вы спрашиваете, почему m.utc().endOf('day') дает вам конец дня в UTC, а не в вашем местном времени. Это по дизайну. utc() означает «относиться ко времени как к UTC», где конец дня — 23:59:59 _in UTC_, что на час позже в Западной Европе. Это похоже на то, как работает offset() ; как только момент находится в определенном смещении UTC, его операции работают в этом контексте.

Другими словами, они говорят совсем о другом (я живу на восточном побережье США):

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"

Надеюсь, это поможет.

Все 3 Комментарий

Какая версия Момента? d не является свойством объекта Moment (по крайней мере, больше). Там есть _d , на который вам определенно не следует ссылаться, и это может ввести в заблуждение. Что касается фактической проблемы, она отлично работает для меня:

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

Я так понимаю, у тебя доисторическая версия?

Я использую версию 2.5.0.

Свойство «_d» — это то, что я использую, чтобы увидеть, какое значение Moment содержит во время отладки. (Извините за недопонимание). Но почему это свойство отличается для местного времени от UTC? Оба имеют часовой пояс +0100 вместо +0100 для местного времени и +0000 для UTC. см. http://jsfiddle.net/3d9eU/5/

Местное время: пятница, 24 января 2014 г., 23:59:59 GMT+0100 (стандартное время Западной Европы)
UTC: сб, 25 января 2014 г., 00:59:59 GMT+0100 (стандартное время Западной Европы), не должно ли это быть пятница, 24 января 2014 г., 23:59:59 GMT+0100 (стандартное время Западной Европы) со свойством _isUTC = true ?

Похоже, вы спрашиваете, почему m.utc().endOf('day') дает вам конец дня в UTC, а не в вашем местном времени. Это по дизайну. utc() означает «относиться ко времени как к UTC», где конец дня — 23:59:59 _in UTC_, что на час позже в Западной Европе. Это похоже на то, как работает offset() ; как только момент находится в определенном смещении UTC, его операции работают в этом контексте.

Другими словами, они говорят совсем о другом (я живу на восточном побережье США):

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"

Надеюсь, это поможет.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги