#АнатомияФункций – custom
Всем привет! В чат подкинули задачку – определить номер недели по ISO.
Вроде ничего сложного, но… По ISO неделя начинается с понедельника (уже хорошо), но первая неделя года – та, что содержит четверг. И в целом номер недели привязывается к четвергу. Как раз сейчас была такая ситуация – 30 и 31 декабря 2024 относятся к первой неделе 2025, потому что четверг (02.01.2025) уже в новом году. А может быть обратная ситуация: 1-3 января 2027 будут относится к 53-ей неделе 2026, потому что четверг (31.12.26) оказывается в прошлом году.
Ну и по этому поводу немножко кода:
fnIsoWeekNum=(x)=>[t=(x)=>Date.AddDays(x,3-Date.DayOfWeek(x,Day.Monday)),
a=t(x),
b=t(#date(Date.Year(a),1,1)),
c=Duration.Days(a-b)/7+Number.From(Date.Year(b)=Date.Year(a))][c]
где
t – функция определения четверга текущей недели (логика простая – берем номер дня недели и находим разницу между 3 и этим номером, разницу добавляем к текущей дате),
a – определяем четверг для текущей даты,
b – изюминка – находим четверг для первого января года НЕ текущей даты, а года её четверга (не забываем, что четверг может оказаться в прошлом году),
c – собственно, разница между a и b, делённая на 7, даст нам разницу в неделях, нумерация при этом должна быть с единицы, поэтому мы должны были бы плюсовать 1, но на самом деле не совсем так, поэтому вишенка - плюсуем 1 только если даты попали в один год, при нумерации с четверга из прошлого года это не требуется.
Как-то так – немножко логики, немножко кода – и задачка решена.
Надеюсь, было полезно.
Всех благ!
@buchlotnik