웹 서비스에서는 게시글이나 댓글이 작성된 시각을 "3분 전", "2시간 전"처럼 표시하는 경우가 많습니다. 이번 글에서는 주어진 타임스탬프(timestamp)를 이러한 상대 시간 형식으로 변환하는 PHP 프로그램을 소개합니다.
예제 코드
<?php
function to_time_ago( $time )
{
$difference = time() - $time;
if( $difference < 1 )
{
return 'less than only a second ago';
}
$time_rule = array (
12 * 30 * 24 * 60 * 60 => 'year',
30 * 24 * 60 * 60 => 'month',
24 * 60 * 60 => 'day',
60 * 60 => 'hour',
60 => 'minute',
1 => 'second'
);
foreach( $time_rule as $sec => $my_str )
{
$res = $difference / $sec;
if( $res >= 1 )
{
$t = round( $res );
return $t . ' ' . $my_str .
( $t > 1 ? 's' : '' ) . ' ago';
}
}
}
echo "The timestamp to time ago conversion is ";
echo to_time_ago( time() - 600);
?>실행 결과
The timestamp to time ago conversion is 10 minutes ago
코드 동작 원리
이 프로그램의 핵심은 to_time_ago라는 이름의 함수입니다. 함수가 호출되면 먼저 현재 시간을 반환하는 time() 함수와 매개변수로 전달받은 시간 사이의 차이를 계산합니다.
만약 두 시간의 차이가 1초 미만이라면, 함수는 즉시 "1초도 지나지 않았다"는 문자열을 반환하고 종료됩니다.
차이가 1초 이상인 경우에는 연(year), 월(month), 일(day), 시(hour), 분(minute), 초(second)에 해당하는 초 단위 값을 키로, 각 시간 단위 이름을 값으로 하는 배열을 생성합니다. 배열은 큰 단위부터 작은 단위 순으로 정렬되어 있어, 가장 적합한 시간 단위를 우선적으로 찾을 수 있습니다.
이후 foreach 반복문을 사용해 배열을 순회하면서, 계산된 시간 차이를 각 단위의 초 값으로 나눕니다. 나눈 결과가 1 이상이 되는 첫 번째 단위를 찾으면, 그 값을 반올림하여 최종 문자열을 만들어 반환합니다. 값이 1보다 크면 복수형 접미사 's'가 붙어 "10 minutes ago"와 같은 자연스러운 표현이 완성됩니다.
활용 팁
한국어 서비스에 적용하려면 반환 문자열을 "10분 전", "2시간 전" 형식으로 바꾸면 됩니다. 또한 실무에서는 윤년이나 월별 일수 차이까지 고려하기 위해 DateTime 클래스와 diff() 메서드를 활용하는 방법도 있으니, 더 정밀한 계산이 필요하다면 함께 참고하시기 바랍니다.