Date2ISOWeekNo Routines
Converts Dates into a Week No and Year according to ISO-8601.

Unit
QESBPCSDateTime

Overloaded Variants
Procedure Date2ISOWeekNo(const DT: TDateTime; var WeekNo: Integer; var Year: Word);
Procedure Date2ISOWeekNo(const DT: TDateTime; var WeekNo, Year: Integer);

Declaration
Procedure Date2ISOWeekNo(const DT: TDateTime; var WeekNo: Integer; var Year: Word);

Description
Weeks are assumed to start with Monday. The week that Jan 4 occurs in is the 1st week of the year. Note that this does mean that there can be 53 weeks in a year!

Parameters
DT Date to process.
WeekNo Returns the ISO-8601 Week Number in specified Year
Year Returns 4 digit year to which the Week Number applies, not necessarily the same year as DT.

Category
Date/Time Arithmetic Routines
Week Based Arithmetic Routines

Implementation

procedure Date2ISOWeekNo (const DT: TDateTime; var WeekNo: Integer;
     var Year: Word);
var
     FirstMonday, StartYear: TDateTime;
     WeekOfs: Byte;
begin
     Year := Date2Year (DT);
     StartYear := GetFirstDayOfYear (Year) + 3; // Jan 4th
     if ISODayOfWeek (StartYear) <= 4 then
     begin
          FirstMonday := StartOfISOWeek (StartYear);
          WeekOfs := 1;
          if DT < FirstMonday then
          begin
               Dec (Year);
               WeekNo := ISOWeeksInYear (Year);
               Exit;
          end;
     end
     else
     begin
          FirstMonday := StartOfISOWeek (StartYear) + 7;
          WeekOfs := 2;
          if DT < FirstMonday then
          begin
               WeekNo := 1;
               Exit;
          end;
     end;
     WeekNo := DaysApart (FirstMonday, StartofISOWeek (DT)) div 7 + WeekOfs;
     if WeekNo > ISOWeeksInYear (Year) then
     begin
          WeekNo := 1;
          Inc (Year);
     end;
End;

Declaration
Procedure Date2ISOWeekNo(const DT: TDateTime; var WeekNo, Year: Integer);

Implementation

procedure Date2ISOWeekNo (const DT: TDateTime; var WeekNo, Year: Integer);
var
     FirstMonday, StartYear: TDateTime;
     WeekOfs: Integer;
begin
     Year := OptDate2Year (DT);
     StartYear := GetFirstDayOfYear (Year) + 3; // Jan 4th
     if ISODayOfWeek (StartYear) <= 4 then
     begin
          FirstMonday := StartOfISOWeek (StartYear);
          WeekOfs := 1;
          if DT < FirstMonday then
          begin
               Dec (Year);
               WeekNo := ISOWeeksInYear (Year);
               Exit;
          end;
     end
     else
     begin
          FirstMonday := StartOfISOWeek (StartYear) + 7;
          WeekOfs := 2;
          if DT < FirstMonday then
          begin
               WeekNo := 1;
               Exit;
          end;
     end;
     WeekNo := DaysApart (FirstMonday, StartofISOWeek (DT)) div 7 + WeekOfs;
     if WeekNo > ISOWeeksInYear (Year) then
     begin
          WeekNo := 1;
          Inc (Year);
     end;
End;


HTML generated by Time2HELP
http://www.time2help.com