PHP 에서 어느 달의 마지막 날을 구하려면
[목차(도우미)]
어떤 이유에서든 주어진 달의 마지막날을 구하고 싶은 때가 있다. 사람이라면 간단히 오른손을 주먹 쥐어 보고 뼈의 올록
볼록한 것을 찾아서 세어 보면 답이 나오겠지만 프로그램으로 구할 때는 간단히 답이 떠오르지 않는다.
예를 들어 2012년2월의 마지막날은? 3월의 0일을 구하는 것과 같다.
mktime의 사양:
http://php.net/manual/en/function.mktime.php
알고리즘의 구현
자주 쓰는 기존 함수가 존재하는지는 조사해 본적이 없으나 간단히 계산하려면 3단계를 거치면 주어진 달의 마지막 날을 구할 수 있다.- 주어진 달의 첫날을 구한다.
- 주어진 달의 다음 달의 첫날을 구한다.
- 다음 달의 첫날에서 하루를 뺀다.
- <?php
- $date = new DateTime('2012-02' . '-01');
- $date->add(new DateInterval('P1M'));
- $date->sub(new DateInterval('P1D'));
- ?>
날짜 계산이란것이 화려하지는 않지만 흔히 쓰이는 것이다
독특한 점은 덧셈과 뺄셈 연산만 수행했으나 교환법칙이 성립하지 않는다는 것이다. 2012-02-01 에서 하루를 먼저 빼고
1달을 더하면 1월31일+1달=2월31일=3월3일이 되어버릴 것이다.
mktime 함수를 쓰는 구현
위와 같이 열심히 연산을 구사하여 계산하고 보니 비슷한 기능을 수행하는 함수가 존재한다는 것을 알게 되었다. PHP 의 내부 구조를 보기 전에는 단정할 수 없으나 내부적으로 알고리즘을 구현하는 함수 매크로 처럼 작동시킬 수 있다.예를 들어 2012년2월의 마지막날은? 3월의 0일을 구하는 것과 같다.
- <?php
- //mktime(H, i, s, month, day, year)
- $date = mktime(0, 0 , 0, 2+1, 0, 2012);
- ?>
http://php.net/manual/en/function.mktime.php
'연구개발 이야기' 카테고리의 다른 글
SerialPort.GetPortNames Error and Bluetooth 의 해결책 (0) | 2012.02.23 |
---|---|
소스코드리뷰(XXXIX) 제발 소스코드를 관리해라 (0) | 2012.02.19 |
자료를 공개해 두는 습관 (7) | 2012.01.19 |
프로그램 가능(programmable)한가? (0) | 2012.01.11 |