[PHP] 두 날짜 사이의 경과 시간 구하기

주어진 두 개의 날짜와 시간(2019-06-30 12:34:56) 사이의 경과 시간을 구하는 코드이다.

<?php
/**
 * 두 날짜 사이의 경과 시간 구하는 함수
 */

function getTimeDiff($date1, $date2, $format) {
    $date1Time = new DateTime($date1);
    $date2Time = new DateTime($date2);

    if (version_compare('5.3', phpversion(), '<=')) {
        $interval = $date1Time->diff($date2Time);

        $diff = $interval->format($format);
    } else {
        $diff = sh_date_interval($date1Time,$date2Time, $format);
    }

    return $diff;
}


/**
 * http://stephenharris.info/date-intervals-in-php-5-2/
 */

function sh_date_interval($_date1,$_date2, $format) {

    //Make sure $date1 is ealier
    $date1 = ($_date1 <= $_date2 ? $_date1 : $_date2);
    $date2 = ($_date1 <= $_date2 ? $_date2 : $_date1);

    //Calculate R values
    $R = ($_date1 <= $_date2 ? '+' : '-');
    $r = ($_date1 <= $_date2 ? '' : '-');

    //Calculate total days
    $total_days = round(abs($date1->format('U') - $date2->format('U'))/86400);

    //A leap year work around - consistent with DateInterval
    $leap_year = ( $date1->format('m-d') == '02-29' ? true : false);
    if( $leap_year ){
        $date1->modify('-1 day');
    }

    $periods = array( 'years'=>-1,'months'=>-1,'days'=>-1,'hours'=>-1);

    foreach ($periods as $period => &$i ){

        if($period == 'days' && $leap_year )
            $date1->modify('+1 day');

        while( $date1 <= $date2 ){
            $date1->modify('+1 '.$period);
            $i++;
        }

        //Reset date and record increments
        $date1->modify('-1 '.$period);
    }

    extract($periods);

    //Minutes, seconds
    $seconds = round(abs($date1->format('U') - $date2->format('U')));
    $minutes = floor($seconds / 60);
    $seconds = $seconds - $minutes * 60;

    $replace = array(
        '%y' => $years,
        '%Y' => zeroise($years, 2),
        '%m' => $months,
        '%M' => zeroise($months, 2),
        '%d' => $days,
        '%D' => zeroise($days, 2),
        '%a' => zeroise($total_days, 2),
        '%h' => $hours,
        '%H' => zeroise($hours, 2),
        '%i' => $minutes,
        '%I' => zeroise($minutes, 2),
        '%s' => $seconds,
        '%S' => zeroise($seconds, 2),
        '%r' => $r,
        '%R' => $R
    );

    return str_replace(array_keys($replace), array_values($replace), $format);
}


/**
 * https://developer.wordpress.org/reference/functions/zeroise/
 */

function zeroise( $number, $threshold ) {
    return sprintf( '%0' . $threshold . 's', $number );
}

PHP 5.2 버전 이상에서 사용할 수 있으며 실행은 아래와 같이 한다.

<?php

$format = '%y년 %m달 %d일 %h시간 %i분 %s초';

$date1 = '2019-07-02 10:56:12';
$date2 = '2019-07-03 03:19:52';

echo getTimeDiff($date1, $date2, $format);

경과 시간은 0년 0달 0일 16시간 23분 40초 처럼 표시된다.

편리

PHP와 MariaDB, jQuery 등을 사용해 게시판, 쇼핑몰 솔루션을 개발합니다. 그누보드5와 영카트5 개발에 참여 했습니다. Linux와 Nginx는 물론 WordPress, Git 등에도 관심이 많습니다. 자전거 타기 및 사진 촬영을 취미로 하고 있습니다.

카카오톡 플러스친구 채팅 : NCUBE.NET

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.