知/Delphi

한 주의 첫 번째 및, 마지막 날짜 구하기.

채수욱 2010. 1. 22. 20:51

// 한주의 첫 번째 날짜 구하기

function getFirstDayOfWeek(aYear, aMonth, aWeek:SmallInt):ShortInt;
var
  dtTmpDate : TDateTime;
  ii, liDays, liFirstDayOfYear, liOffsetDay, liResult : SmallInt;
  function getDaysOfMonth(y, m : Word): Integer;
  begin
    case m of
    1,3,5,7,8,10,12 : Result := 31;
    4,6,9,11 :        Result := 30;
    2 : begin
        if (y mod 4 = 0)  then
        begin
          if (y mod 100 = 0)  then
          begin
            if (y mod 400 = 0)  then Result := 29
            else Result := 28;
          end else
            Result := 29;
        end else
          Result := 28;
       end;
    end;
  end;
begin
  liDays := 0;
  dtTmpDate := StrToDateTime(IntToStr(aYear) + '-01-01');
  liFirstDayOfYear := DayOfTheWeek(dtTmpDate);    // 그해 1월 1일이 무슨 요일인지 계산.

  // 원하는 달 전달까지의  날짜 구하기.
  for ii := 1 to aMonth-1 do
  begin
    liDays := liDays + getDaysOfMonth(aYear, ii);
  end;

  liOffsetDay := liFirstDayOfYear + (liDays mod 7);  //요일의 변화를 구한다.
  liOffsetDay := liOffsetDay mod 7; //7일보다 클 경우에 다음주로 간주. 실제로는 입력한 달의 1일의 요일이 나옴.

  // 그 주의 첫째 날을 구한다.
  if(aWeek = 1) then liResult := 1
  else
    liResult := 7*(aWeek-2) + (7-liOffsetDay) + 1;  //월요일 기준 -> 일요일 기준.

  // 날짜를 검증한다. 입력한 주차가 해당 달에 없을 경우에는 0을 Return.
  if(liResult > getDaysOfMonth(aYear, aMonth)) then
    liResult := 0;
  Result := liResult;
end;

 

//한 주의 마지막 날짜 구하기

function getLastDayOfWeek(aYear, aMonth, aWeek:Smallint):ShortInt;
var
  dtTmpDate : TDateTime;
  ii, liDays, liFirstDayOfYear, liOffsetDay, liResult : SmallInt;
  function getDaysOfMonth(y, m : Word): Integer;
  begin
    case m of
    1,3,5,7,8,10,12 : Result := 31;
    4,6,9,11 :        Result := 30;
    2 : begin
        if (y mod 4 = 0)  then
        begin
          if (y mod 100 = 0)  then
          begin
            if (y mod 400 = 0)  then Result := 29
            else Result := 28;
          end else
            Result := 29;
        end else
          Result := 28;
       end;
    end;
  end;
begin
  liDays := 0;
  dtTmpDate := StrToDateTime(IntToStr(aYear) + '-01-01');
  liFirstDayOfYear := DayOfTheWeek(dtTmpDate);    // 그해 1월 1일이 무슨 요일인지 계산.

  // 원하는 달 전달까지의  날짜 구하기.
  for ii := 1 to aMonth-1 do
  begin
    liDays := liDays + getDaysOfMonth(aYear, ii);
  end;

  liOffsetDay := liFirstDayOfYear + (liDays mod 7);  //요일의 변화를 구한다.
  liOffsetDay := liOffsetDay mod 7; //7일보다 클 경우에 다음주로 간주. 실제로는 입력한 달의 1일의 요일이 나옴.

  // 그 주의 마지막 날을 구한다.
  liResult := 7*(aWeek-1) + (7-liOffsetDay);  //월요일 기준 -> 일요일 기준.

  // 날짜를 검증한다. 입력한 주차가 해당 달에 없을 경우에는 마지막 날짜를 Return.
  if(liResult > getDaysOfMonth(aYear, aMonth)+6) then
    liResult := 0
  else if(liResult > getDaysOfMonth(aYear, aMonth)) then
    liResult := getDaysOfMonth(aYear, aMonth);
  Result := liResult;
end;