"AND" "OR"
Главная Информер Журнал Форум

Как узнать номер недели данного дня в году.

Компилятор: Delphi

Вариант 1:

    Function WeekOfYear(ADate: TDateTime): Word;
    Var Day: Word;
        Month: Word;
        Year: word;
        FirstOfYear: TDateTime;
    Begin
     DecodeDate(ADate,Year,Month,Day);
     FirstOfYear:=EncodeDate(Year,1,1);
     IF (ADate=EncodeDate(Year,12,31)) or
        (ADate=FirstOfYear) then Result:=1 else Result:=Trunc(ADate - FirstOfYear) div 7+1;
    End;
    

Вариант 2:

    Function WeekNum(const ADate: TDateTime): word;
    Var Year: Word;
        Month: Word;
        Day: Word;
    Begin
     DecodeDate(ADate + 4 - DayOfWeek(ADate + 6),Year,Month,Day);
     Result:=1+Trunc((ADate-EncodeDate(Year,1,5) +
     DayOfWeek(EncodeDate(Year,1,3))) / 7);
    End;
    

Вариант 3:

    Function MyWeekOfYear(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;
    

Вариант 4:

    Function MyWeekOfYear2(Date: TDateTime): Word;
    { А можно просто воспользоваться стандартной функцией, если
      вашем Дельфи есть библиотека DateUtils.dcu. Не забудьте её подключить }
    Begin
     Result:=WeekOf(Date);
    End;
    

А теперь проверка всех вариантов:

    procedure TForm1.Button1Click(Sender: TObject);
    begin
     ShowMessage(IntToStr(WeekOfYear(StrToDate('31.12.2003'))));
     ShowMessage(IntToStr(WeekNum(StrToDate('31.12.2003'))));
     ShowMessage(IntToStr(MyWeekOfYear(StrToDate('31.12.2003'))));
     ShowMessage(IntToStr(MyWeekOfYear2(StrToDate('31.12.2003'))));
    end;