윤년 계산하는 방법 PHP, ASP
개요
보통 달력을 만들거나 해당 달이 몇일까지 있는지 혹은 그해가 윤년이 있는지 등을 알기 위해서 윤년 계산을 하게 됩니다.
즉 윤년은 400 으로 나누어지는 (나머지가 0 인경우) 경우와 4 로 나누어지면서 100 으로 나누어지지 않는 경우입니다. 이렇게 해서 윤년인 해의 2월은 29일까지 평년인 경우 28일로 정하고, 나머지 달은 1, 3, 5, 7, 8, 10, 12 월은 31일 4, 6, 9, 11 월은 30 일로 설정하게 됩니다.
쉬운 방법이지만, 뭔가 좀 이상하고, 불편하다는 느낌이 듭니다.
PHP 에서는 해당달의 총일자를 구하는 함수도 있습니다. 물론 ASP ??없지요..
PHP
<?php
//첫요일과 총일자 숫자로 얻기
$intTimeStamp = mktime(0,0,0,$nowMonth,1,$nowYear);
// 해당달($nowMonth) 의 1일의 타임스탬프 얻기
$intFirstDayNum = date(w,$intTimeStamp);
// 해당달($nowMonth) 의 요일을 숫자로 얻어오기
$cntMonthDay = date(t,$intTimeStamp);
// 해당달($nowMonth) 의 총일자수
?>
ASP 에서는 그런 함수가 없어서 윤년 계산법을 이용해야 하는 불편이 있었습니다.
하지만 달력을 만들면서 꼼수? Tip 을 찾았습니다.
ASP
''= 그 달의 첫날의 요일과 총일자 숫자로 가져오기
intFirstDayNum = WeekDay(nowYear & "-" & nowMonth & "-01")
'''= 해당월(nowMonth) 1일의 요일을 숫자로 반환
cntMonthDay = Day(DateSerial(nowYear, nowMonth + 1, 1 - 1))
'''= 해당달(nowMonth)의 총일자수
DateSerial() 함수
함수에 대한 설명은 다음과 같이 되어 있습니다.
Returns a Variant of subtype Date for a specified year, month, and day. DateSerial(year, month, day)
특정한 - 즉 지정한 년,월,일에 해당하는 날짜형식에 맞는 값을 반환합니다.
예를 들면..
Dim MyDate1, MyDate2
MyDate1 = DateSerial(1970, 1, 1) ' Returns January 1, 1970.
MyDate2 = DateSerial(1990 - 10, 8 - 2, 1 - 1) ' Returns May 31, 1980.
즉 MyDate1 은 그냥 1970년 1월 1일을 그대로 반환합니다. 별볼일 없죠? 하지만 MyDate2 는 1990에서 10을 빼서 1980년, 8월에서 2를 빼서 6월 여기서 중요한 1일에서 1을 뺐으니 0이 되어야 합니다.
그러면 숫자계산으로는 1980년 6월 0일이 되겠죠? 하지만 날짜??0일이 없습니다.
여기는 DateSerial 함수는 +, 혹는 - 를 단순히 숫자계산이 아닌 해당 년,월,일에서 몇년, 몇월, 몇일 다음, 또는 이전을 뜻합니다.
즉 1990 - 10 은 1990년 보다 10년 전 년도를 뜻합니다. 그러므로 1 - 1 은 1일의 하루 전날 즉 그 전달의 마지막 날짜를 뜻합니다. 최종적으로 보면 1980년 6월 1일의 하루 전날 = 1980년 5월 31일이 됩니다.
그래서 이번달의 총일자수를 얻으려면 다음달 1일에서 하루 전날을 구해보면 되겠죠?
결국 Day(DateSerial(nowYear, nowMonth + 1, 1 - 1)) 이렇게 이번달 nowMonth 에 1을 더한 다음달 에서 1일의 하루 전날 즉 이번달의 마지막 날을 구합니다.
몇월달인지 윤년인지, 평년인지 상관할 필요없습니다. 이미 컴퓨터는 윤년인지 아닌지 알고 있으니까요. 오히려 제 설명 때문에 복잡하고 이상하죠? 그러면 그냥 함수 사용법만 익히시면 됩니다.
문서 업데이트 내역
날짜 | 내용 |
---|---|
2023-01-07 | 문서 최초 생성 |