Хорошо, у нас есть несколько проблем:
Первое: часовые пояса
Дата работает с вашим местным часовым поясом, поэтому, когда вы делаете newDate.setHours(0, 0, 0, 0);
и прочеетаким образом, он устанавливает объект на эти часы в вашем часовом поясе.Однако, когда вы делаете .getTime()
, он возвращает миллис из эпохи в UTC.
Результат этого: если вы находитесь в gmt + 530 (Индия, я считаю), когда вы делаете .getTime () Миллис из эпохи будет отключен этой разницей (5 ч 30 м).
Чтобы компенсировать это, вы можете использовать getTimezoneOffset()
:
const nearestMonday = date => {
const monday = 1;
const currentDay = date.getDay();
const distance = (monday + 7 - currentDay) % 7;
const newDate = new Date(date.getTime());
newDate.setDate(date.getDate() + distance);
newDate.setHours(0, 0, 0, 0);
newDate.setTime(newDate.getTime()-1000*60*newDate.getTimezoneOffset());
return newDate;
}
С другой стороны, ваш код, использующий момент, будет корректно работать с часовыми поясами, поэтому нет необходимости его менять.
Второй: какой понедельник?
Ваша функция nearestMonday
вычисляет следующий Понедельник.
Функция startOf('isoWeek')
устанавливает дату на понедельник текущей недели.
Если вы хотите, чтобы оба вычислили current , вам следует изменить nearestMonday
следующим образом:
const nearestMonday = date => {
const monday = 1;
const currentDay = date.getDay();
const distance = monday - currentDay;
console.log('dist', distance);
const newDate = new Date(date.getTime());
newDate.setDate(date.getDate() + distance);
newDate.setHours(0, 0, 0, 0);
newDate.setTime(newDate.getTime()-1000*60*newDate.getTimezoneOffset());
return newDate;
}
Последнее: воскресенье?
getDay()
в воскресенье вернет 0. Следовательно, «ближайший понедельник» будет днем после этого.Я не исправил это, так как я не знаю, является ли это желаемым поведением, но отметил это только ради завершения