id:TakamiChie:20060907:1157579832でも書いた体育の日がずれているという件(実は、先月の成人の日もずれていたのです、スミマセン)ですが、今回どうにかしようとしてやっと原因に気づきました。
というのも、今までは
「n週目の日曜日の日付を得る→指定した曜日の分だけ先の日付を祝日する」という考え方で計算していたので、最初の日曜日以前に日付がある曜日(今月なら木、金、土の三曜)については、取得できる日付が一週間ずれてしまうということでした。
数式でどうにかできそうな気がしたのですが、結局、一日の曜日以降の曜日を指定した場合、日付を一週間ずらすことにしました。何か負けた気がしますが、とりあえずこれでOK かな――?
wIndexOnce := DayOfWeek(StartOfAMonth(Year, Month)); wIndexTarget:= Integer(AWeekOf) + 1; // n週目の日付を取得 Result := 7 - wIndexOnce + wIndexTarget + 7 * (Index - 1) + 1; // 一日の曜日以降の曜日の場合、一週間ずらす if wIndexOnce <= wIndexTarget then Dec(Result, 7);