TryEncodeDateMonthWeek calculates the TDateTime value that is represented by a specified day for a specified week, in a specified month and year, and tests whether a valid TDateTime value would be generated from those specified individual parts.

The time portion of the return AValue is 00:00:00 - midnight at the start of the specified day ADayOfWeek.

The definitions for AWeekOfMonth and ADayOfWeek follow the ISO 8601 standard.

  • AYear is the year which can be any value from 1 through 9999 inclusive.

  • AMonth can be any month value from 1 through to 12 inclusive.

  • AWeekOfMonth is the week within AMonth, where 1 is the first week that includes four or more days.

    • If the first calendar day of the month is a Friday, Saturday, or Sunday, then those three days must be expressed using AMonth set to the previous month, and AWeekOfMonth must be set to the number of weeks in the previous month.

    • Similarly, if the last calendar day of the month is a Monday, Tuesday, or Wednesday, then those three days are expressed with AMonth set to the following month and AWeekOfMonth is set to 1.

  • ADayOfWeek is the day of the week, where 1 is Monday, 2 is Tuesday e.t.c., with 7 representing Sunday.

If any of the specified parameters are not within range, TryEncodeDateMonthWeek will return False.

TryEncodeDateMonthWeek returns True if the component parts AYear, AMonth, AWeekOfMonth, and ADayOfWeek produce a date that represents a valid TDateTime value.

Declaration: function TryEncodeDateMonthWeek(const AYear, AMonth, AWeekOfMonth, ADayOfWeek: Word; var AValue: TDateTime): Boolean;

procedure OnMapEvent(var Value:Variant);
var
aYear, aMonth, aWeek, aDay : word;
yDate, yDate1 : TDateTime;
begin
//This test will pass
aYear := 2024;
aMonth := 10;
aWeek := 2;
aDay := 3;
aGo := TryEncodeDateMonthWeek(aYear, aMonth, aWeek, aDay, yDate);
If aGo = True then
LogInfo('The date works - '+FormatDateTime('dd-mm-yyyy hh:nn:ss.zzz', yDate))
else
LogInfo('The date DOES NOT work - '+FormatDateTime('dd-mm-yyyy hh:nn:ss.zzz', yDate));
 
//This test will fail
aYear := 2024;
aMonth := 10;
aWeek := 2;
aDay := 8;
aGo := TryEncodeDateMonthWeek(aYear, aMonth, aWeek, aDay, yDate1);
If aGo = True then
LogInfo('The date works - '+FormatDateTime('dd-mm-yyyy hh:nn:ss.zzz', yDate1))
else
LogInfo('The date DOES NOT work - '+FormatDateTime('dd-mm-yyyy hh:nn:ss.zzz', yDate1));
 
end;