// Set date to nearest thursday
// If getDay is 0 it's sunday, we change the day number to 7 making it the last day of the week
d.setDate(d.getDate() + 4 - (d.getDay() || 7));
На данном этапе d
является чистой датой. Существует ровно 7 возможных значений для d.getDay()
, соответствующих дню недели: 0
для воскресенья, 1
для понедельника и т. Д.
Как отмечается в комментарии, || 7
означает, что теперь у нас есть 1
для понедельника, ..., 7
для воскресенья.
Для любой даты, если мы вычтем ее номер дня недели (в этой системе), мы получимВоскресенье перед этим (попробуйте!). Например, сегодня вторник, 5 ноября 2019 года. Число дней недели - 2. Сегодня минус 2 дня - это воскресенье до сегодняшнего дня.
Затем мы добавляем 4, что будет означать, что мы в четверг по желанию. Это «ближайший» четверг из-за отображения 0 -> 7. Без сопоставления от 0 до 7 для воскресенья, воскресенье 3 ноября 2019 года закончится четвергом 7; с тем отображением, оно заканчивается в четверг 31 октября, что ближе.
// First calculate delta of start of year and given date in milliseconds: (d - yearStart)
// Then we divide that by 86.400.000 ((d - yearStart) / 1000 / 60 / 60 / 24 ) to know difference in days
// Then we calculate the number of weeks
return Math.ceil((((d - yearStart) / 86400000) + 1) / 7); // <-- why + 1?
В этот момент d
- четверг с чистой датой, а yearStart
- 1 января того же года.
Вычитание даты из даты даетнам разница в миллисекундах . В день приходится 86400000 миллисекунд, поэтому деление значения daet-вычитания на 86400000 дает нам разницу в днях.
Итак, ((d - yearStart) / 86400000)
- это день года, начинающийся с 0
для 1 января.
Мы хотим получить значение для недели в году, поэтому мы делим на 7, который в большинстве случаев даст нам нецелое число, но нам нужно целое число, поэтому мы берем потолок (т.е. округляем).
Однако это будет означать, что 1-го января (который является дневным)года 0) будет единственным днем недели 0. Очевидно, мы не хотим этого, поэтому добавляем 1 к нашему дню года.
Так что (((d - yearStart) / 86400000) + 1)
- это день-го года, начиная с 1
для 1 января.
Теперь у нас есть числа от 1 до 365 (или 366) для дней года;разделите на 7 и округлите, чтобы получить числа от 1 до 53, для недель года.