Количество недель в месяце
Для календаря, который я делаю, мне понадобилось узнать, сколько недель затрагивает месяц. Решение пришло моментально:
Результат := Неделя_последнего_дня - Неделя_первого_дня;
В коде я оформил это так:
function GetWeekInMonth(ADate: TDate): Integer;
begin
Result := WeekOf(EndOftheMonth(ADate)) - WeekOf(StartOfTheMonth(ADate));
end;
Через полчаса понял, что решение не верное
.
Данная функция неверно считает недели. Вот пример (см. скриншот):
Как по вашему, что выдаст данная функция для июня 2008-го года? На скриншоте видно, что месяц затрагивает 6 недель, а функция вернет 5. Но это не самое страшное. Для декабря 2008-го года функция вернет -48!!!
Вся проблема кроется в функции DecodeDateWeek в модуле DateUtils. Для данного скриншота она засчитает только последний день месяца, а 1-е число отнесет к предыдущему месяцу. В итоге получится 5 недель, а не 6. А для декабря последний день месяца быдет уже в следующем году, т.е. номер недели для него будет равен еденице, в то время как номер недели для 1-го декабря будет равен 49, что и дает в итоге -48.
Решение, в данном случае, очень простое и примитивное, хотя, признаюсь, я на него потратил более 3-х часов жизни. Для того, чтобы узнать сколько недель затрагивает месяц, надо сделать очень просто - прибавить к месяцу столько дней, на сколько первый день смещен относительно понедельника и от получившейся суммы вычислять количество недель:
function GetWeekInMonth(ADate: TDate): Integer;
var
lDays: Integer;
begin
lDays := DayOfTheWeek(StartOfTheMonth(FCurrentDate)) +
DaysInMonth(FCurrentDate);
Result := lDays div 7;
if Result * 7 <> lDays then
Inc(Result);
end;
Надеюсь, кому-нибудь пригодится.
+0