본문 바로가기

php

php 날짜 함수 관련


날짜 및 시간 관련 함수(Date/Time Functions) - php

2007.11.01 12:32 | HTML스크립트 | 태현아빠

http://kr.blog.yahoo.com/tipeman/1156 

날짜 및 시간 관련 함수(Date/Time Functions)

PHP에서 제공하는 날짜 및 시간과 관련된 함수는 다음과 같은 것들이 있다.

 

함수명

기     능

  checkdate

  주어진 날짜 및 시간이 타당한지를 검사한다.

  date

  주어진 옵션에 따른 포맷으로 시간이나 날짜를 출력한다.

  strftime

  해당 locale을 기준으로 주어진 옵션에 따른 포맷으로 시간이나 날짜를 출력한다.

  mktime

  특정 날짜 및 시간에 해당하는 유닉스 시간(초 단위)을 얻는다.

  time

  현재의 시간에 해당하는 유닉스 시간을 얻는다.

  getdate

  날짜 및 시간 정보를 연관 배열의 형태로 얻는다.

 

checkdate 함수

checkdate() 함수는 다음과 같이 정의된다.

 

 int checkdateint month, int day, int year);

    인자로 주어진 날짜가 타당한지를 검사하여 타당할 경우 true를 , 그렇지 않을 경우 false를 반환한다.

예를 들어, 1999년 2월 30일 이라는 날짜는 실제로는 존재하지 않는다. 따라서 checkdate(2,30,1999)의 실행 결과는 false를 반환한다. 아래의 예제를 보자.

 

 

 <?

 

   $res = checkdate(2,29,2000);

   if($res) {

      echo("입력하신 날짜는 올바른 정보입니다.");

   } else {

      echo("입력하신 날짜는 올바르지 않은 정보입니다.");

   }

 

 ?>

 

[예제2.1] checkdate() 함수의 사용

 

[예제2.1]의 3행에서는 2000년 2월 29일에 대한 타당성 검사를 수행한다. 2000년 2월은 윤년으로서 29일까지 존재하므로 이 날짜는 실제로 존재하는 타당한 날짜이다. 따라서 3행의 결과는 true 이므로 그 결과 5행이 출력된다. 물론 checkdate() 함수는 윤년까지 고려한다는 얘기다.

checkdate() 함수를 이용하면 해당 월이 총 며칠인지를 쉽게 알 수 있다. 물론 2월을 제외하고 나머지 달의 총 일수는 정해져 있다. 다음의 [예제2.2]를 보자.

 

 

 <?

 

   function get_totaldays($year,$month) {

      $day = 1;

      while(checkdate($month,$day,$year)) {

         $day++;

      }

      

      $day = $day - 1;

      return $day;

   }

   

   $totalD = get_totaldays(2000,2);

   echo("2000년 2월은 ${totalD}일까지 있습니다.");

 

 ?>

 

[예제2.2] checkdate() 함수를 이용하여 해당 월의 일수 구하기

 

[예제2.2]의 3행에서 정의한 get_totaldays() 함수는 인자로 전해준 해당 연월의 총 일자를 계산한다. 즉, 1일부터 시작하여 while 구문으로 각 날짜에 대한 타당성 검사를 수행하면 9행에서처럼 해당 월의 마지막 날짜를 확인할 수 있다. 위 스크립트의 실행 결과 2000ss 2월의 마지막 날짜는 29일이라는 것을 알 수 있다.

 

 2000년 2월은 29일까지 있습니다.

 

date 함수

date() 함수의 정의는 다음과 같다.

 

 string date(string format, int timestamp);

주어진 timestamp에 해당하는 시간을 지정한 형식(format)에 맞게 출력한다. 여기서 timestamp이라고 하는 것은 1970년 1월 1일을 기준으로 특정 시점까지 경과된 시간을 초 단위로 표시한 시간을 의미한다. 예를 들면, 1999년 1월 1일은 1970년 1월 1일로부터 915,116,400초가 경과된 시간이므로 1999년 1월 1일을 timestamp으로 표시하면 915,116,400이 되는 것이다. 반대로 timestamp값이 "915115400"인 것을 날짜로 환산하면 1999년 1월 1일이 되는데 포맷(format)을 어떻게 주느냐에 따라 1월을 January로 출력할 수도 있고 시간을 12시간제(AM,PM)나 24시간제로 출력하는 등 다양한 형태로 표현할 수 있다.

date() 함수 호출시 지정할 수 있는 출력 포맷으로는 다음과 같은 종류가 있다.

 

출력 형식

기능

Y

연도를 네 자리수로 출력한다.

 1999

y

연도를 두 자리수로 출력한다.

 99

M

월을 세 자리 영문자로 출력한다.

 Jan

m

월을 두 자리수로 출력한다.

 01-12

F

월을 완전한 영문자로 출력한다.

 January

d

일자를 두 자리수로 출력한다.

 01-31

j

일자를 출력하는데 10일 이하는 한 자리수로 출력한다.

 1-9,10-31

l

완전한 영문자로 요일을 출력한다.

 Friday

w

요일을 한자리 숫자로 출력한다.

 일(0), 월(1), 화(2)...

D

세 자리수 영문자로 요일을 출력한다.

 Fri

H

시간을 24시간제로 출력한다.

 23

h

시간을 12시간제(오전,오후)로 출력한다.

 11

a

am 이나 pm 으로 출력한다.

 

A

AM 이나 PM 으로 출력한다.

 

i

분을 출력한다.

 

s

초를 출력한다.

 

z

그해의 몇 번째 일수인지를 출력한다. 이 값은 0부터 시작하므로 윤년이 아닌 경우의 12월 31일은 364(즉, 365일째)로 출력한다.

 

아래의 예제를 보면 date() 함수의 쓰임새를 알 수 있을 것이다.

 

 

 <?

   $res = mktime(23,15,23,1,21,1999);

   echo("timestamp으로 ${res}은 1999년 1월 21일 23시 15분 23초로 다음과 같이 출력할 수 있습니다.<p>");

   

   $str = date('년도출력 - Y 또는 y', $res);

   echo("$str<br>");

 

   $str = date('월출력 - M 또는 m 또는 F', $res);

   echo("$str<br>");

   

   $str = date('일출력 - d 또는 j', $res);

   echo("$str<br>");   

   

   $str = date('요일출력 - l 또는 D 또는 w', $res);

   echo("$str<br>");      

 

   $str = date('시간출력 - H 또는 h', $res);

   echo("$str<br>");         

   

   $str = date('분출력 - i', $res);

   echo("$str<br>");            

   

   $str = date('초출력 - s', $res);

   echo("$str<br>");               

   

   $str = date('1999년의 몇일째 출력 - z', $res);

   echo("$str<p>");                  

   

   $str = date("Y년 m월 d일 H시 i분 s초 입니다.",$res);

   echo("$str<br>");

   

   $str = date("Y년 xx m월 d일 H시 i분 s초 입니다.",$res);

   echo("$str<br>");   

   

   $str = date("Y년 m월 d일 H시 i분 s초 입니다.");

   echo("$str");      

 ?>

 

[예제2.3] date() 함수를 이용한 날짜의 다양한 출력

 

[예제2.3]의 출력 결과는 다음과 같다.

 

 timestamp으로 916928123은 1999년 1월 21일 23시 15분 23초로 다음과 같이 출력할 수 있습니다.

 

 연도 출력 - 1999 또는 99

 월출력 - Jan 또는 01 또는 January

 일출력 - 21 또는 21

 요일 출력 - Thursday 또는 Thu 또는 4

 시간출력 - 23 또는 11

 분출력 - 15

 초출력 - 23

 1999년의 몇일째 출력 -20

 

 1999년 01월 21일 23시 15분 23초입니다.

 1999년 xx 01월 21일 23시 15분 23초입니다.

 1999년 10월 08일 03시 37분 33초입니다.

[예제2.3]에서 보면 알 수 있듯이 date() 함수의 포맷으로 어떤 문자를 지정해 넘겨주느냐에 따라서 같은 날짜라도 다양하게 출력할 수 있다. 단 32행처럼 포맷 지정자가 아닌 문자(xx)를 지정했을 경우에는 해당 문자가 그대로 출력된다.

 

만일 date() 함수의 두 번째 인자(timestamp)를 지정해주지 않으면 디폴트로 현재 시간에 대한 timestamp 값이 인자로 전달된다.

 

strftime 함수

strftime() 함수의 정의는 다음과 같다.

 

 string strftime(string format, int timestamp);

   strftime()함수는 date() 함수와 동일한 역할을 수행하여 함수 호출시에 지정해 준 format에 따라 날짜 정보를 출력한다. 그러나 date() 함수와는 다르게 setlocale() 함수로 지정해 준 locale의 언어로 결과를 출력할 수 있다. 예를 들면, setlocale() 함수로 ko를 locale로 설정하면 strftime() 함수를 호출하여 월명이나 요일명 등의 정보를 영어가 아닌 우리말로도 출력시킬수 있다. 반면에 fr로 설정하면 당연 프랑스어로 출력이된다. 그런 점을 제외하고는 date() 함수와 쓰임새가 거의 비슷하다고 보면 된다. date() 함수와 마찬가지로 timestamp을 생략하면 현재 시간의 timestamp 값이 인자로 전달된다.

strftime() 함수에서 사용 가능한 format 옵션은 다음과 같다.

 

포맷옵션

기능

%Y

연도를 네 자리수로 출력한다.

 1999

%y

연도를 두 자리수로 출력한다.

 99

%B

현재의 locale에 따른 월명을 완전한 이름으로 출력한다.

 

%b

현재의 locale에 따른 월명을 축약하여 출력한다.

 

%d

일자를 두 자리수로 출력한다.

 0-31

%a

현재의 locale에 따른 요일명을 축약하여 출력한다.

 

%A

현재의 locale에 따른 요일명을 완전한 문자로 출력한다.

 

%w

요일명을 한 자리 숫자로 출력한다.

 일(0), 월(1), 화(2)...

%H

시간을 24시간제로 출력한다.

 23

%l

시간을 12시간제(오전,오후)로 출력한다.

 11

%M

분을 출력한다.

 

%S

초를 출력한다.

 

%Z

현재의 타임존(timezone)을 출력한다.

 

%x

핸개의 locale에 따른 날짜(월/일/년)를 출력한다.

 

%X

현재의 locale에 따른 시간(시/분/초)을 출력한다.

 

%U

  • 올해 몇 번째 주가 지났는지를 출력한다.
  • 첫 주의 첫 날로 첫 번째 일요일을 기준 시간으로 한다.

 

%W

  • 올해 몇 번째 주가 지났는지를 출력한다.
  • 첫 주의 첫 날로 첫 번째 월요일을 기준 시간으로 한다.

 

다음의 예제를 보면 strftime() 함수의 쓰임새를 알 수 있다.

 

 

 <?

 

 $str = strftime("%Y 또는 %y");

 echo("년도출력 - $str");

 echo("<p>");

 

 setlocale("LC_TIME","en");

 $str = strftime("%B 또는 %b");

 echo("월명출력 - $str");

 echo("<br>");

 

 setlocale("LC_TIME","ko");

 $str = strftime("%B 또는 %b");

 echo("월명출력 - $str");

 echo("<br>");

 

 setlocale("LC_TIME","fr");

 $str = strftime("%B 또는 %b");

 echo("월명출력 - $str");

 echo("<p>");

 

 $str = strftime("%d");

 echo("일자출력 - $str");

 echo("<p>");

 

 setlocale("LC_TIME","en");

 $str = strftime("%a 또는 %A 또는 %w");

 echo("요일출력 - $str");

 echo("<br>");

 

 setlocale("LC_TIME","ko");

 $str = strftime("%a 또는 %A 또는 %w");

 echo("요일출력 - $str");

 echo("<br>");

 

 setlocale("LC_TIME","fr");

 $str = strftime("%a 또는 %A 또는 %w");

 echo("요일출력 - $str");

 echo("<p>");

 

 $str = strftime("%H 또는 %I");

 echo("시간출력 - $str");

 echo("<p>");

 

 $str = strftime("%M");

 echo("분출력 - $str");

 echo("<p>");

 

 $str = strftime("%S");

 echo("초출력 - $str");

 echo("<p>");

 

 $str = strftime("%Z");

 echo("timezone - $str");

 echo("<p>");

 

 $str = strftime("%x - %X");

 echo("날짜 - 일자출력 - $str");

 echo("<p>");

 $str = strftime("%U");

 echo("올해 지금까지 ${str}주가 지났습니다.");

 echo("<p>");

 

 setlocale("LC_TIME","ko");

 $str = strftime("%Y %B %d일 %A %H시 %M분 %S초");

 echo("현재 날짜및 시간은 ${str} 입니다.");

 ?>

 

[예제2.4] strftime() 함수를 이용한 날짜의 다양한 출력

 

[예제2.4]를 보면 strftime() 함수의 호출시 두 번째 인자가 모두 생략되어 있으므로 현재 시간, 즉 [예제2.4]의 스크립트가 샐행되는 시점에서의 날짜 정보가 출력된다.

출력 약식을 확인할 수 있도록 필자가 특정 시점에서 실행시킨 결과를 보이면 아래와 같다. [예제2.4]의 코드를 보면 setlocale()함수로 서로 다른 locale을 설정하고 그때의 요일과 월명을 출력해보았다.

[예제2.4]의 7,12,17행을 보면 setlocale 함수로 각각 en,ko,fr의 값을 locale로 설정하였다. 즉, 이 말은 이렇게 locale을 설정하게 되면 각 locale에 해당하는 월명과 요일명의 출력이 가능하게 되는 것이다. en 은 영어, ko 는 한국어, fr 은 프랑스어로 각각의 언어에 해당하는 문자가 출력되는 것을 아래의 결과에서 확인할 수 있다. 이제 strftime() 함수와 date() 함수의 차이가 이해될 것이다.

 

 연도 출력 - 1999 또는 99

 월명출력 - October 도는 Oct

 월명출력 - 10월 또는 10월

 월명출력 - octobre 또는 oct.

 

 일자출력 - 08

 

 요일출력 - Fri 또는 Friday 또는 5

 요일출력 - 금 또는 금요일 또는 5

 요일출력 - ven. 또는 vendredi 또는 5

 

 시간출력 - 04 또는 04

 

 분출력 - 59

 

 초출력 -28

 

 timezone - 한국 표준시

 

 날짜 - 일자출력 - 08/10/99 - 04:59:28

 

 올해 지금까지 40주가 지났습니다.

 

 현재 날짜 및 시간은 1999 10월 08일 금요일 04시 59분 28초입니다.

 

mktime 함수

mktime() 함수는 다음과 같이 정의된다.

 

 int mktime(int hour, int minute, int second, int month, int day, int year);

   앞서 date() 함수를 설명할 때 유닉스 timestamp의 개념에 대해 설명했다. mktime() 함수는 말 그대로 timestamp 값을 얻어내는 기능을 한다. 함수 호출시에 timestamp 값을 알고자 하는 날짜를 전달하면 그 날짜에 해당하는 timestampo 값을 알 수 잇다. 만일 아무 인자도 없이 호출하면 현재의 시간이 인자로 전달된다.

mktime() 함수의 쓰임새는 아래와 같다.

 

 

 <?

 

   $res = mktime();

   echo("현재 시간의 timestamp값은 ${res}(초)입니다.<br>");

   

   $res = mktime(0,0,0,1,1,1999);

   echo("1999년 1월 1일의 timestamp값은 ${res}(초)입니다.<br>");

 

?>

 

[예제2.5] mktime() 함수는 초 단위의 유닉스 시간을 알려준다.

 

[예제2.5]의 실행 결과는 다음과 같다.

 

 현재 시간의 timestamp 값은 939327648(초)입니다.

 1999년 1월 1일의 timestamp 값은 915116400(초)입니다.

[예제2.5]의 5행에서 1999년 1월 1일의 timestamp 값을 구하기 위해 mktime() 함수를 호출하였다. 앞서 이야기한 것처럼 2행에서 mktime() 함수 호출시에 인자를 전달해주지 않으면 스크립트를 실행한 시간에 해당하는 timestamp 값을 얻게 된다.

 

timestamp 값은 게시판이나 방명록에서의 게시물 작성 시간을 데이터베이스에 저장할 때 자주 쓰는 아주 유용한 포맷이다. 이 값만 알고 있으면 여기에서의 날짜 및 시간관련 함수를 이용하여 여러 가지 형태로 시간 정보의 출력이 가능하기 때문이다.

 

time 함수

time() 함수는 다음과 같이 정의된다.

 

 int time(void);

   time() 함수는 mktime() 함수에서 인자를 전달하지 않은 경우와 같다. 즉, time() 함수는 현재 시간의 timestamp 값을 반환한다. 따라서 게시판에서 게시물의 작성시간은 이 time() 함수로 알아낼 수 있다.

 

getdate 함수

getdate() 함수는 다음과 같이 정의된다.

 

 array getdate(int timestamp);

   getdate() 함수는 날짜 정보를 timestamp 형태로 받아들여 연/월/일/시간/분/초 등과 같은 정보를 담은 연관 배열로 반환한다.

getdate() 함수가 반환하는 연관 배열의 참조키로는 다음과 같은 종류가 있다.

 

참조키

내  용

"second"

 시간(초)

"minutes"

 시간(분)

"hours"

 시간(시)

"mday"

 일자

"wday"

 요일 (숫자 형태로 출력)

"mon"

 월

"year"

 년도

"yday"

 1년 365일 중 며칠째인가를 출력

"weekday"

 요일 (영문자 전체로 출력)

"month"

 월 (영문자 전체로 출력)

 

[예제2.6]을 보자

 

 

 <?

 

   $timeinfo = getdate(time());

   

   while(list($key,$val) = each($timeinfo)) {

      echo("$key - $val<br>");

   }

   

   echo("<br>");

   echo $timeinfo["year"] . " - " . $timeinfo["month"] . " - " . $timeinfo["weekday"] . " - " . $timeinfo["mday"];

 

 ?>

 

[예제2.6] getdate() 함수는 시간과 날짜 정보를 연관 배열에 저장한다.

 

3행에서 getdate() 함수의 임자로 현재 시간의 timestamp을 반환하는 time() 함수를 전달했다. 따라서 현재 시간(스크립트 실행 시간)에 대한 정보가 연관 배열 $timeinfo에 저장된다. 5행~7행은 앞에서 자주 보았던 코드일 것이다. 연관 배열 내 참조키와 값을 모두 출력하는 코드이다. 물론 연관 배열이므로 10행처럼 원하는 부분만 뽑아서 출력할 수도 있다.

 

달력 만들기 예제

달력을 출력하려면 무엇을 알아야 할까를 생각해보면 우선 출력하고자 하는 해당 월의 총 일수를 알아야 하고 또 그 달의 1일이 무슨 요일인지도 알아야 한다. 여기서 제시하는 [예제2.7]의 달력 소스에서는 showCalendar() 라는 함수를 정의하여 인자로 전달된 특정 연월의 달력을 출력한다.

 

 

 <?

   ########## 해당연월의 일수를 계산한다.

   function get_totaldays($year,$month) {

 

      $date = 1;

      while(checkdate($month,$date,$year)) {

          $date++;

      }

   

      $date--;

      return $date;

   }

   

   ########## 해당연월의 달력을 출력한다.

   function showCalendar($year,$month,$total_days)

   {

      $first_day = date('w', mktime(0,0,0,$month,1,$year));

 

      echo("<TABLE WIDTH=\"492\" BORDER=\"0\" cellspacing=\"0\" cellpadding=\"1\">\n");

      echo("<TR><TD BGCOLOR=\"BLUE\">\n");

      echo("<TABLE WIDTH=\"490\" BORDER=\"0\" cellspacing=\"1\" cellpadding=\"10\">\n");

    echo("<TR>\n");

      echo("   <TH bgColor=\"lightblue\" COLSPAN=\"7\">${year}년 ${month}월 달력</TH>\n");

      echo("</TR>\n");

      echo("<TR>\n");

      echo("   <TH bgColor=\"pink\" width=70><img src=\"images/spacer.gif\" width=\"70\" height=\"1\" border=\"0\">일</TH>\n");

      echo("   <TH bgColor=\"pink\" width=70><img src=\"images/spacer.gif\" width=\"70\" height=\"1\" border=\"0\">월</TH>\n");

      echo("   <TH bgColor=\"pink\" width=70><img src=\"images/spacer.gif\" width=\"70\" height=\"1\" border=\"0\">화</TH>\n");

      echo("   <TH bgColor=\"pink\" width=70><img src=\"images/spacer.gif\" width=\"70\" height=\"1\" border=\"0\">수</TH>\n");

      echo("   <TH bgColor=\"pink\" width=70><img src=\"images/spacer.gif\" width=\"70\" height=\"1\" border=\"0\">목</TH>\n");

      echo("   <TH bgColor=\"pink\" width=70><img src=\"images/spacer.gif\" width=\"70\" height=\"1\" border=\"0\">금</TH>\n");

      echo("   <TH bgColor=\"pink\" width=70><img src=\"images/spacer.gif\" width=\"70\" height=\"1\" border=\"0\">토</TH>\n");

      echo("</TR>\n");

      echo("<TR>\n");

 

      $col = 0;

      for($i = 0; $i < $first_day; $i++) {

         echo("   <TD BGCOLOR=\"#FFFFFF\">&nbsp;</TD>\n");      

         $col++;

      }

 

for($j = 1; $j <= $total_days; $j++) {

         echo("   <TD BGCOLOR=\"#FFFFFF\">$j</TD>\n");

         $col++;

 

         if($col == 7) {

            echo("</TR>\n");

            if($j != $total_days) {

               echo("<TR>\n");

            }

            $col = 0;

         }

}

    

while($col > 0 && $col < 7) {

         echo("   <TD BGCOLOR=\"#FFFFFF\">&nbsp;</TD>\n");

         $col++;

}

 

      echo("</TR>\n");

      echo("</TABLE>\n");

      echo("</TD></TR>\n");

      echo("</TABLE>\n");

   }

?>

 

 <html>

<head>

   <title>PHP로 구현하는 달력프로그램</title>

   <style type="text/css">

   <!--

      BODY,TR,TH,TD {

         font-family: "굴림";

         font-size: 10pt;

         line-height : 12pt;

      }

   //-->

   </style>

</head>

 

<body bgColor="#FFFFFF">

 

<?

        $inputY = "2000";

        $inputM = "2";

        

        $totaldays = get_totaldays($inputY,$inputM);

        showCalendar($inputY,$inputM,$totaldays);

?>

 

</body>

</html>

[예제2.7] 달력 출력 프로그램 소스

 

[예제2.7]의 코드를 보면 1행에서 65행까지는 달력을 출력하는데 필요한 두 개의 함수 get_totaldays()와 showCalendar()를 정의한 부분이고 67행부터 92행까지는 이들 함수를 호출하여 달력을 출력하는 부문이다.

 

여기에서는 2000년 2월의 달력을 출력하고자 84행과 85행에서 변수 $inputY와 $inputM에 각각 2000과 2를 할당하였다. 87행에서는 [예제2.2]에서 설명했던 get_totaldays() 함수를 이용하여 2000년 2월이 총 몇 일인지를 계산하였다. 88행의 showCalendar() 함수는 출력하고자 하는 연도와 월, 그리고 해당 연월의 총 일수를 인자로 받아 해당 연도 해당 월, 즉 2000년 2월의 달력을 출력한다.

 

showCalendar() 함수는 해당 연월(2000년 2월)의 1일이 무슨 요일인지를 알아내어 그 요일 전까지는 38,39행과 같이 공백의 셀로 출력하고 1일부터 그 달 마지막 날, 즉 인자로 전해받은 총 일수까지는 43행과 같이 날짜를 함께 셀에 출력한다. 다만 출력시에 일주일이 7일이므로 셀을 출력할 때마다 46행처럼 변수 $col을 증가시키다가 그 값이 7이 될 때 <TR> 태그를 이용하여 테이블의 다음 줄에 날짜를 계속 출력하는 구조로 정의되어 있다.

1일이 무슨 요일인지 한 자리 숫자로 얻기 위해 17행에서는 아래처럼 date() 함수의 출력 포맷으로 'w'를 주었다.

 

 $first_day = date('w', mktime(0,0,0,$month,1,$year));      // 화요일이므로 2를 반환

2000년 2월 1일은 화요일이다. 이를 한 자리 숫자로 표시하면 2에 해당한다. 따라서 첫 두 칸은 공백으로 출력하고 다음 칸부터 그 달 마지막 날까지는 변수 $col 값의 증가에 따라 달력의 날짜를 계속 출력한다.

'php' 카테고리의 다른 글

Cookie 와 Session  (0) 2009.12.08
$_SERVER["HTTP_REFERER"] 란?  (0) 2009.12.08
substr_count 함수  (0) 2009.12.08
urlencode, urldecode  (0) 2009.12.04
php xml parser  (0) 2009.11.27