Почему добавляется 1? - PullRequest
0 голосов
/ 05 ноября 2019

Я получил этот код от https://gist.github.com/vincentorback/8edffeca20e7a9e5e2a6 и мне было интересно узнать об этом пару вещей.

/**
 * Gets the ISO week number for a given date.
 * @param d either Date or number, the date to get week number for.
 * @returns The ISO week number for given date.
 */
function getWeekNumber(d: any) {
    // copy given date
    d = new Date(+d);
    d.setHours(0, 0, 0, 0);
    // 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));
    const yearStart: any = new Date(d.getFullYear(), 0, 1);
    // 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?
}

Я не совсем понимаю, почему + 1 делается там. А также почему номер дня меняется на 7, когда это воскресенье?

Я пытался комментировать вещи, которые я выяснил, но если все еще неясно, дайте мне знать!

1 Ответ

1 голос
/ 05 ноября 2019
// 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, для недель года.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...