| Date2ISOWeekNo Routines |
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 RoutinesImplementation
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; |
|
|