function WeekOfYear(Dat: TDateTime): Word;
// Интерпретация номеров дней:// ISO: 1 = Понедельник, 7 = Воскресенье// Delphi SysUtils: 1 = Воскресенье, 7 = Субботаvar
Day, Month, Year: Word;
FirstDate: TDateTime;
DateDiff: Integer;
begin
day := SysUtils.DayOfWeek(Dat) - 1;
Dat := Dat + 3 - ((6 + day) mod 7);
DecodeDate(Dat, Year, Month, Day);
FirstDate := EncodeDate(Year, 1, 1);
DateDiff := Trunc(Dat - FirstDate);
Result := 1 + (DateDiff div 7);
end;
Функция Delphi!
Функция WeekOfYear вычисляет номер текущей недели, принимая дату в виде входных данных. Вот разбивка на шаги, что код делает:
Переменные
Day: день недели (0-6), где 1 - воскресенье и 7 - суббота
Month, Year: месяц и год компоненты даты входных данных
FirstDate: первая дата года (1 января)
DateDiff: разница между датой входных данных и первой датой года
Алгоритм
1. Вычислите день недели для заданной даты с помощью SysUtils.DayOfWeek.
2. Аккумулируйте дату, отняв 3 дня от нее, эффективно перемещаясь к понедельнику (если оригинальная дата была воскресеньем или позже). Это делается с помощью (6 + day) mod 7, которая вычисляет количество дней до следующего понедельника.
3. Извлеките год, месяц и день компоненты из аккумулированной даты с помощью DecodeDate.
4. Вычислите разницу между датой входных данных и первой датой года (1 января) с помощью Trunc(Dat - FirstDate). Это дает нам общее количество дней с начала года.
5. Разделите эту разницу на 7, чтобы получить номер недели, добавив 1 для учета нулевых недель.
Возвращаемое значение
Функция возвращает вычисленный номер недели в виде слова (16-разрядного целого).
Замечания
Стандарт ISO определяет первый день недели как понедельник, а Delphi' с SysUtils использует воскресенье. Это отражено в коде, отняв 1 от результата DayOfWeek.
Функция предполагает, что дата входных данных является валидной и находится в текущем году.
В целом, это прямая реализация расчета недели года. Если вам нужно улучшить производительность или обработать краевые случаи (например, даты через годы), рассмотрите добавление дополнительных проверок и оптимизаций.
Функция WeekOfYear определяет номер текущей недели на основе заданной даты с помощью алгоритма, учитывающего интерпретацию дней недели в соответствии с международным стандартом ISO и библиотекой Delphi SysUtils.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.