高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

n週目の月曜日 といった浮動休日がずれる問題について

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