PHP로 날짜 다루기
* 참고사이트 : http://www.phpbuilder.com/columns/akent20000610.php3
Unix에서 1970년 1월 1일 자정 이후에 경과된 시간을 초로 계산해서 보여주는 방법을 Unix Epoch라고 부릅니다. PHP에서 다음과 같은 부분을 삽입해서 실행해 보세요.
<? echo time();? > |
위와 같은 결과를 볼 수 있는데 이것은 2003년 3월 3일 월요일 19시 29분을 나타냅니다.
PHP에서 날짜를 다루는 많은 함수들은 Time()함수에 의한 반환되는 값인 timestamp를 요청합니다. 또, PHP는 Window와 Unix에서 동일한 방법으로 timestamp를 사용할 수 있는데 이것은 다른 OS에서도 이 코드를 사용할 수 있는 것을 말합니다.
time()함수는 Integer를 반환하기 때문에 데이터베이스나 Text파일에서 처럼 저장할 수 있습니다. 이것은 더 이상 시간/날짜 데이터베이스 필드가 필요 없다는 것을 말합니다.
참고 : 위의 결과이미지는 윈도우에서 PHP 쉘스크립트를 사용해서 결과를 얻은 후
이미지로 저장한것입니다.
나중에 PHP 쉘스크립트를 다루는 방법에 대해서 배우지만 여기서 간단히 윈도우에서 어떻게 사용환경을 구축하는지 알아보도록 하겠습니다.
먼저, '시작 - 제어판 - 폴더옵션'을 선택합니다.
위와 같은 창이 뜨면 확장명에 PHP라는 것이 있는지 확인합니다.
만약, 없다면 '새로만들기'를 눌러서 다음과 같이 생성합니다.
그 다음, 폴더옵션창의 '고급'을 선택하면 다음과 같은 창이 뜰것입니다.
여기서 파일형식명을 적어주고 '새로 만들기'를 선택합니다.
'작업' 줄에는 "Run"이라고 쓰고 '응용프로그램' 줄에는 실제적으로 명령을
실행하는 파일이 있는 경로를 지정합니다.
이제, 윈도우에서 PHPT 쉘스크립트를 사용할 수 있습니다.
PHP에서 Unix Timestamp를 출력해주는 2가지 방법이 있습니다.
첫 번째는 date()함수입니다. 이 함수는 두 개의 인자를 가지고 있는데 하나는 출력하고자 하는 포맷형식이고 다른 하나는 Unix Timestamp입니다.
date()함수의 원형은
string date (string format [, int timestamp]) |
와 같습니다. 포맷 문자열은 원하는 형식으로 날짜와 시간을 나타내 줍니다. "18h01 Sunday 21 May"와 같은 형식으로 보여줄 수 있습니다.
바꾸어 주기를 원하는 각 부분마다 하나의 문자열이 사용됩니다. 이 문자열은 PHP메뉴얼에서 찾아 볼 수 있습니다. 이 문자열들의 수는 규칙에 어긋나서는 안됩니다. 이것들은 요일, 월, 2자리 형식의 연도, 4자리 형식의 연도, AM인지 PM인지 등을 보여줍니다. 다음에 있는 표를 참고하세요.
[표1-1] string format으로 쓰이는 문자열
다음과 같이 PHP로 작성하세요.
<? echo date ("Hhi l d F" ,time()); ?> |
이것을 실행 시켜보면
위와 같은 형식의 결과를 얻을 것입니다.
PHP메뉴얼에 h는 시간을 01~12로 표현한다고 되어있습니다.그래서 위와 같은 결과가 나온 것입니다.
만약,18h12 Sunday 21 May와 같은 형식의 결과를 보기원한다면 2가지 방법이 있습니다. 하나는 H와 h사이에 공백을 주는 것이고 다른 하나는 다음과 같이 하면 됩니다.
<?echo date ("H\hi l d F", time());?> |
이것을 실행시키면
위와 같은 결과를 출력합니다.
data()함수도 괜찮지만 만약 시간과 날짜에 대해서 좀 더 완전한 문장으로 정보를 얻기원한다면 어떻게 해야 될까요? 우리는 strftime()라고 불리는 다른 함수를 사용할 수 있습니다.
Strftime()함수는 2가지 이점이 있습니다. 하나는 setlocale()함수를 사용해서 원하는 언어로 시간과 날짜를 표현할 수 있다는 것이고 다른 하나는 자유로운 형식으로 날짜와 시간정보를 삽입할 수 있다는 것입니다.
strftime()함수의 원형은
string strftime ( string format [, int timestamp]) |
와 같습니다.
strftime()는 문자열 앞에 %를 쓴다는 것을 제외하면 date()와 쓰는 법이 비슷합니다. 다음 표를 참고하세요.
[표1-2] string format으로 쓰이는 문자열
다음은 위의 예제에 strftime()를 사용한 것입니다.
<? echo strftime ("%Hh%M %A %d %b" ,time()); ?> |
이것을 실행시키면
앞에서 Unix timestamp를 출력 할 수 있는 date()와 strftime()에 대해서 언급했습니다. 다른 것으로 getdate()가 있습니다. 이것은 Unix timestamp를 요청하며 연관배열 형태로 날짜를 반환합니다.
getdate()함수의 원형은
array getdate ( [int timestamp]) |
와 같습니다.
<? $date_time_array = getdate (time()); echo $date_time_array[ "weekday"]; ?> |
위와 같이 입력하면
"weekday"이외에 다른것도 쓸 수 있습니다. 다음 표를 참고 하세요.
[표1-3] int timestamp로 쓰이는 문자열
mktime()함수는 특정 시간 값을 가지고 와서 Unix timestamp로 바꿀 수 있습니다.
mktime()함수의 원형은
int mktime(int hour, int minute, int second, int month, int day, int year, int [is_dst] ); |
와 같습니다.
왼쪽으로부터 시간, 분, 초, 월, 일, 년을 제공받습니다. 마지막에 열거된 인자는 낮인지 아닌지를 말해줍니다. 이것은 선택적인 사항이어서 없어도 상관없습니다.
다음과 같이 PHP로 작성하세요.
<? echo mktime (0, 0, 0, 5, 27, 2000); ?> |
이것을 실행 시켜보면
시간, 분, 초에 0을 입력했는데 이것은 자정이라는 것을 알려줍니다.
"yyyy/mm/dd"와 같은 형식도 계산할 수 있습니다. 다음을 보세요.
<? $access_date = "2000/05/27"; // explode()함수는 구분자를 통해서 문자열로 나누어 줍니다. // 여기서는 "/"가 구분자로 사용됩니다. $date_elements = explode("/" ,$access_date); // 여기서 date_elements[0] = 2000, $date_elements[1] = 5, //$date_elements[2] = 27입니다. echo mktime (0, 0, 0, $date_elements [1], $date_elements [2], $date_elements [0]); ?> |
이것을 실행 시켜보면
"yyyy/mm/dd hh:mm:ss AM/PM" 형식과 같은 좀 더 복잡한 것도 계산할 수 있습니다.
다음을 보세요
<? $date_time_string = "2000/05/27 02:40:21 PM"; // 3개의 구분자로 date, time and AM/PM을 구분합니다. $dt_elements = explode(" " ,$date_time_string); $date_elements = explode("/" ,$dt_elements[ 0]); $time_elements = explode(":" ,$dt_elements[ 1]); // PM은 시간에 12를 더해서 계산 할 수 있습니다. if ($dt_elements [2]== "PM") { $time_elements[ 0]+=12; } // 결과를 출력합니다. echo mktime ($time_elements [0], $time_elements[1], $time_elements[ 2], $date_elements[1], $date_elements[2], $date_elements[0]); ?> |
이것을 실행 시켜보면
우리는 어떻게 mktime()함수를 사용해서 각각의 날짜와 시간요소로부터 unix timestamp를 얻어 오는 것을 보았습니다.
만약 우리가 현재 시간과 날짜에 대해 Unix timestamp를 얻기 원하다면 어떻게 해야될까요? 다소 무의미한 연습일 수도 있지만 이것은 나중에 우리가 하려고 하는 것에 도움을 줍니다.
우리는 mktime()는 시간, 분, 초, 월, 일, 연도 인자를 가지고 있는 것을 알고 있습니다. getdate()로 얻은 배열값을 다음과 같은 형태로 사용할 수 있습니다.
<? // timestamp를 getdate()를 통해서 배열형태로 반환합니다. $timestamp = time(); echo $timestamp; echo "<p>"; $date_time_array = getdate( $timestamp); // mktime()을 이용해서 다시 unix timestamp를 재생성 합니다. $timestamp = mktime($date_time_array ["hours"], $date_time_array["minutes" ],$date_time_array ["seconds"],$date_time_array ["mon"], $date_time_array["mday" ],$date_time_array[ "year"]); echo $timestamp; ?> |
혼란스럽게 보여서 약간 보기 쉽게 만들었습니다.
<? // 현재의 timestamp를 getdate()를 통해서 배열형태로 반환 $timestamp = time(); echo $timestamp; echo "<p>>"; $date_time_array = getdate( $timestamp); //시간, 분, 초, 월, 일, 연도를 변수에 할당 $hours = $date_time_array[ "hours"]; $minutes = $date_time_array["minutes"]; $seconds = $date_time_array[ "seconds"]; $month = $date_time_array["mon"]; $day = $date_time_array["mday"]; $year = $date_time_array["year"]; // mktime()을 이용해서 다시 unix timestamp롤 재생성 $timestamp = mktime($hours ,$minutes, $seconds, $month ,$day,$year); echo $timestamp; |
이제 getdate()에 의해 만들어진 배열의 정보를 얻어 와서 적당한 이름으로 바꾸어서 코드를 더 읽기 쉽고 이해하기 쉽게 만들었습니다. 만약 현재 시간에서 19시간을 더하기를 원한다면 mktime()에 $hours를 입력하는 대신에 $hours+19를 입력하면 됩니다. mktime()은 자동적으로 다음날로 넘어갈 것이다. 다음을 보세요
<? // 현재 timestamp를 배열로 반환한다. $timestamp = time(); echo strftime( "%Hh%M %A %d %b",$timestamp); echo "<p>>"; $date_time_array = getdate($timestamp); $hours = $date_time_array["hours"]; $minutes = $date_time_array["minutes"]; $seconds = $date_time_array["seconds"]; $month = $date_time_array["mon"]; $day = $date_time_array["mday"]; $year = $date_time_array["year"]; // mktime()을 사용해서 unix timestamp를 다시 생성한다. // $hours에 19시간을 더한다. $timestamp = mktime($hours + 19, $minutes, $seconds, $month, $day,$year); echo strftime( "%Hh%M %A %d %b",$timestamp); echo "<br>~E after adding 19 hours"; ?> |
다음과 같은 값을 얻을 수 있습니다.
13h06 Saturday 12 Feb 08h06 Sunday 13 Feb ~E after adding 19 hours |
똑같은 방법으로 시간을 뺄 수 있고 빼주는 시간의 양을 원하는 형태로 적절히 바꿀 수 있습니다.
두개의 시간의 차이를 구하는 것도 간단합니다. 2개의 unix timestamp를 얻어와서 하나에서 다른 하나를 빼면 됩니다. 2개의 시간의 차이를 초로 나타내어 주는데 이것은 계산되어 일, 시간, 분과 초로 바꿀 수 있습니다.
만약 일반적으로 사용되는 2개의 ASP함수를 PHP로 바꿀 수 있다면 PHP에서 날짜와 시간을 다루는것에 대해 쉽게 설명할 수 있습니다. 첫 번째로 DataAdd함수입니다. DataAdd함수는 VBScript문서에 "시간간격 만큼 증가시켜서 날짜를 반환한다"고 되어있습니다.
DataAdd()함수의 원형은
DateAdd(interval,number,date) |
와 같습니다.
interval은 증가시키기 원하는 시간의 형태를 정의한 문자표현, number은 증가시키기 원하는 간격을 수로 표현한 것, date는 날짜를 말합니다.
다음은 interval로 사용할 수 있는 문자열 표입니다.
w,y,d는 현재 날짜에서 하루씩 증가되고, q는 3개월씩, ww는 7일씩 증가됩니다.
다음과 같이 만들어 보세요.
<? //DateAdd함수를 정의합니다. function DateAdd ($interval, $number, $date) { //getdate()함수를 통해 얻은 배열값을 각각의 변수에 지정합니다. $date_time_array = getdate($date); $hours = $date_time_array["hours"]; $minutes = $date_time_array["minutes"]; $seconds = $date_time_array["seconds"]; $month = $date_time_array["mon"]; $day = $date_time_array["mday"]; $year = $date_time_array["year"];} //switch()구문을 사용해서 interval에 따라 적용합니다. switch ($interval) { case "yyyy": $year +=$number; break; case "q": $year +=($number*3); break; case "m": $month +=$number; break; case "y": case "d": case "w": $day+=$number; break; case "ww": $day+=($number*7); break; case "h": $hours+=$number; break; case "n": $minutes+=$number; break; case "s": $seconds+=$number; break; } //mktime()함수를 이용해서 unix timestamp반환합니다. timestamp = mktime($hours ,$minutes, $seconds, $month, $day, $year); return $timestamp; } ?> |
이 코드를 dateadd.inc에 저장하고 다음 코드를 실행시켜 보세요.
<? //dateadd.inc파일을 포함시킵니다. include('dateadd.inc'); //현재 시간을 출력합니다. $temptime = time(); echo strftime( "%Hh%M %A %d %b",$temptime); //DateAdd함수를 호출하고 결과값을 출력한다. $temptime = DateAdd("n" ,50,$temptime); echo "<p>"; echo strftime( "%Hh%M %A %d %b",$temptime); ?> |
다음과 같은 실행결과를 반환할 것입니다.
15h41 Saturday 03 Jun 16h31 Saturday 03 Jun |
위에서 DateAdd()함수를 만드는 방법을 보았습니다. 이제 2번째 방법인 DateDiff()함수에 대해 알아봅시다.
DateDiff()는 문서에 보면 "두 날짜의 간격을 수로 반환하는것"이라고 되어있습니다.
DataDiff()함수의 원형은
DateDiff(interval,date1,date2,[firstdayofweek],[firstweekofyear]) |
와 같습니다.
interval은 DateAdd 함수에서 사용했던 것과 같이 사용할 수 있습니다.
VBScript의 DateDiff함수와 기본적인 인자는 동일하지만, 간단하게 하기위해서, VBScript의 DateDiff에서 사용하는 interval인자와 같이 쓰지 않습니다.
여기서는 interval을 "w", "d", "h", "n", "s"를 사용 하겠습니다.
다음과 같이 만들어 보세요.
<? //DateDiff함수를 정의합니다. Function DateDiff ($interval, $date1,$date2) { // 두 날짜간 시간간격을 초로 얻을 수 있습니다. // bcdiv()는 오른쪽의 인자로 왼쪽의 인자를 나누어준 값을 반환합니다. $timedifference = $date2 - $date1; switch ($interval) { case "w": $retval = bcdiv($timedifference ,604800); break; case "d": $retval = bcdiv( $timedifference,86400); break; case "h": $retval = bcdiv ($timedifference,3600); break; case "n": $retval = bcdiv( $timedifference,60); break; case "s": $retval = $timedifference; break; } return $retval; } ?> |
이 코드를 datediff.inc파일로 저장하고 다음 코드를 실행시켜 보세요.
<? //datediff.inc와 dateadd.inc파일을 포함시킵니다. include('datediff.inc'); include('dateadd.inc'); //현재의 시간을 출력합니다. $currenttime = time(); echo "Current time: ". strftime("%Hh%M %A %d %b" ,$currenttime)."<br>"; //DateAdd함수를 호출합니다. $newtime = DateAdd ("n",50 ,$currenttime); echo "Time plus 50 minutes:". strftime("%Hh%M %A %d %b" ,$newtime)."<br>"; //DateDiff함수를 호출합니다. $temptime = DateDiff ("n",$currenttime ,$newtime); echo "Interval between two times: ".$temptime; ?> |
다음과 같은 실행결과를 반환할 것입니다.
Current time: 16h23 Saturday 03 Jun Time plus 50 minutes: 17h13 Saturday 03 Jun Interval between two times: 50 |
이번 강좌에서는 날짜를 다루는 함수들을 이용해서 좀 더 쉽게 날짜를 다룰 수 있는 커맨드를 만들어 보았습니다. 가만히, 생각해보면 위에 나온 커맨드 말고도 얼마든지 다른 커맨드를 만들 수 있을것 입니다. 한 번 만들어 보세요.
다음 강좌에서는 파일 업로드 대해 이야기 해 보도록 하겠습니다.
================================================================