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; |
|