Для обобщенного решения рассмотрим:
function getDayNumber(baseDate, targetDate, daysInCycle) {
var startOfBaseDate = new Date(baseDate).setHours(0, 0, 0, 0);
var startOfTargetDate = new Date(targetDate).setHours(0, 0, 0, 0);
var differenceInDays = Math.round((startOfTargetDate - startOfBaseDate) / 864e5);
return ((differenceInDays % daysInCycle + daysInCycle) % daysInCycle) + 1;
}
-
baseDate
- это любой Date
объект (или отметка времени), который соответствует «Дню 1» цикла. -
targetDate
- это объект Date
(или отметка времени), для которого вы хотите найти номер дня. daysInCycle
- это количество дней до повторения цикла, например 6
для шестидневного цикла.
Примеры:
getDayNumber(new Date(2019, 1, 18), new Date(2019, 1, 15), 6) //=> 4
getDayNumber(new Date(2019, 1, 18), new Date(2019, 1, 16), 6) //=> 5
getDayNumber(new Date(2019, 1, 18), new Date(2019, 1, 17), 6) //=> 6
getDayNumber(new Date(2019, 1, 18), new Date(2019, 1, 18), 6) //=> 1
getDayNumber(new Date(2019, 1, 18), new Date(2019, 1, 19), 6) //=> 2
getDayNumber(new Date(2019, 1, 18), new Date(2019, 1, 20), 6) //=> 3
getDayNumber(new Date(2019, 1, 18), new Date(2019, 1, 21), 6) //=> 4
getDayNumber(new Date(2019, 1, 18), new Date(2019, 1, 22), 6) //=> 5
getDayNumber(new Date(2019, 1, 18), new Date(2019, 1, 23), 6) //=> 6
getDayNumber(new Date(2019, 1, 18), new Date(2019, 1, 24), 6) //=> 1
getDayNumber(new Date(2019, 1, 18), new Date(2019, 1, 25), 6) //=> 2
getDayNumber(new Date(2019, 1, 18), new Date(2019, 1, 26), 6) //=> 3
Для baseDate
или targetDate
вы можете передать Date.UTC(2019, 1, 18)
, если хотите использовать день UTCв качестве основы.
Для targetDate
вы можете передать либо new Date()
, либо Date.now()
, чтобы использовать текущую метку времени.
Также обратите внимание, что в последней строке функции используется модульрешение дано здесь , чтобы обеспечить правильную обработку отрицательных чисел (даты до базовой даты).