php 입문 | 텍스트 및 날짜 조작 | 시간에 대한 주요 기능


이어서 일시 설명하겠다. 시간이라는 것은 컴퓨터의 내부와 일반 세계에서 확실히 취급 방법이 다르다. 컴퓨터에서 시간은 “어느 기준이 되는 날짜로부터 경과"에 의해 표현된다.

PHP에서 일시는 “타임 스탬프(timestamp)“라는 값으로 표현된다. 이는 1970년 1월 1일 오전 0시 정각부터 경과된 초 단위로 표시한 것이다. 이 정수의 값은 시간을 나타내는데 가장 기본이 된다.

그러나 그런 수치는 사람이 바로 알 수 없기 때문에, 그것을 바탕으로 하여 “년, 월, 일, 시, 분, 초"의 값으로 일시를 얻을 수 있도록 하는 함수가 준비되어 있다.

현재의 타임 스탬프를 얻기

$변수 = time();

우선 기본으로 타임 스탬프를 얻는 함수이다. 이것으로 지금 현재의 타임 스탬프 값을 얻을 수 있다.

일시의 요소를 배열로 얻기

$변수 = getdate(타임 스탬프);

이 함수는 일시 사용의 기본이 된다. 이것은 인수에 타임 스탬프 값을 넣으면 “년,월,일,시,분 초” 각각의 값을 연관 배열로 반환한다. 인수를 생략하면 현재 시간 값을 돌려준다. 반환되는 연관 배열에 포함되는 주요 요소는 다음과 같다.

  • year : 년
  • mon : 월
  • mday : 일
  • hours : 시
  • minutes : 분
  • seconds : 초
  • wday : 요일 (0 ~ 6의 정수)

일시 값에서 타임 스탬프를 얻기

$변수 = mktime(시, 분, 초, 월, 일, 년);

이번에는 반대이다. “년, 월, 일, 시, 분, 초” 숫자를 바탕으로, 그 시간의 타임 스탬프 값을 검사하는 함수이다. 일단 인수가 6개나 있지만, 실은 필수적인 것은 첫번째 뿐이다. 이후에는 생략하면 현재 날짜와 시간 값이 자동으로 적용시킬 수 있다.

그럼 간단한 사용 예제를 보도록 하자.

<?php
    if ($_POST != null){
        $num = $_POST['text1'] * 1;
        $t = time() + (60 * 60 * 24 * $num);
        $d = getdate($t);
        $result = "오늘 부터 " . $num . "일 후는、" .
            $d['year'] . "년" . $d['mon'] . "월" .
            $d['mday'] . "일 입니다.";
    }
?>
<!DOCTYPE html>
<html lang="ko">
    <head> 
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
        <title>sample page</title>
    </head>
    <body>
        <h1>Hello PHP!</h1>
        <p><?php echo $result; ?></p>
        <hr>
        <form method="post" action="./index.php">
            <input type="text" name="text1">
            <input type="submit">
        </form>
        <hr>
    </body>
</html>

위에 예제는 입력 필드에 날짜를 적어 제출하면 오늘부터 그 기간 이후의 날짜를 계산하고 표시를 한다.

우선 time에서 현재의 타임 스탬프를 취득하여, 그에 지정된 날짜의 초(60 × 60 × 24 × 일수)을 더해 지정된 기간 후에 타임 스탬프를 계산하고 마지막으로 getdate에서 타임 스탬프 년월일을 얻으면 끝이다. 중간에 타임 스탬프는 단순한 정수로 변환하여 계산하면 의외로 간단하다.

날짜 계산을 수행

날짜를 사용한 계산을 수행해 보자. 여기에서는 날짜 값을 입력 받아, 오늘부터 그 날까지 며칠인지 알아 보겠다.

우선 예제 코드부터 보도록 하겠다.

<?php
    if ($_POST != null){
        $str = $_POST['text1'];
        $d = explode("/", $str);
        $t1 = time();
        $t2 = mktime(0, 0, 0, $d[1], $d[2], $d[0]);
        $n = ceil(($t2 - $t1) / (60 * 60 * 24));
        $result = $str . "은、오늘부터 {$n} 일 후입니다.";
    }
?>
<!DOCTYPE html>
<html lang="ko">
    <head> 
        <meta http-equiv="Content-Type"
            content="text/html; charset=UTF-8" /> 
        <title>sample page</title>
    </head>
    <body>
        <h1>Hello PHP!</h1>
        <p><?php echo $result; ?></p>
        <hr>
        <form method="post" action="./index.php">
            <input type="text" name="text1">
            <input type="submit">
        </form>
        <hr>
    </body>
</html>

입력 필드에 “2020/1/13"과 같이 년월일을 슬래시(/)로 구분하여 작성하여 전송하면, 오늘부터 그 날까지의 일수를 계산하여 표시한다.

이전에는 오늘부터 며칠 후 날짜를 계산했지만, 여기에서는 계산의 기본은 “타임 스탬프 변경한다"이다. 두 날짜를 각각 타임 스탬프를 변경하여, 그 차이를 계산하여 1일의 초로 나누면 일수 알 수 있다.

$str = $ _POST [ 'text1'];
$d = explode("/", $ str);

먼저 전송된 텍스트를 explode으로 슬래쉬(/) 기호로 분해하여 날짜를 배열로 만든다.

$t1 = time();
$t2 = mktime(0,0,0, $ d [1], $ d [2], $ d [0]);

이어서 현재 날짜와 준비한 배열 값의 날짜 및 시간 스탬프를 각각 준비한다.

$n = ceil(($t2 - $t1) / (60 * 60 * 24));

2개의 타임 스탬프의 차이를 60 × 60 × 24로 나누면 일수가 나온다. 그러나 이번에는 시분초는 지정을 하지 않았기 때문에, 소수점 이하가 표시될 것이다. 그래서 소수점 이하를 잘라내기 위해, “ceil"라는 함수를 사용하고 있다. 이는 소수점 이하를 반올림한 값을 반환하는 함수이다.

이와 같이, 일시 관계는 “년, 월, 일, 시, 분, 초” 값과 타임 스탬프를 교대로 교환할 수있는 방법만 알면 간단한 계산 등은 쉽게 수행할 수 있다.