반응형
주로 SNS에서 몇초전, 몇분전, 며칠전 이런 형태로 나오는 부분
$limit_unit에 second, minute, hour, day, month, year를 입력받아서 최대 hour 일경우 몇 시간 전까지만 나오고
이후에는 Y-m-d H:i 형태로 나오게 옵션에서 변경 가능 합니다.
function timeAgo($datetime, $limit_unit = 'day') {
$now = new DateTime();
$ago = new DateTime($datetime);
$diff = $now->diff($ago);
// 시간 단위별 기준값 (초 단위)
$limits = [
'second' => 60,
'minute' => 3600, // 60분
'hour' => 86400, // 24시간
'day' => 2592000, // 30일
'month' => 31536000, // 12개월
'year' => PHP_INT_MAX
];
// 총 경과 시간을 초 단위로 계산
$totalSeconds = ($diff->days * 86400) + ($diff->h * 3600) + ($diff->i * 60) + $diff->s;
// 설정된 제한 단위보다 크면 날짜 형식으로 반환
if ($totalSeconds >= $limits[$limit_unit]) {
return $ago->format('Y-m-d H:i');
}
// 상대적 시간 반환
if ($diff->y > 0) return $diff->y . '년 전';
if ($diff->m > 0) return $diff->m . '개월 전';
if ($diff->d > 0) return $diff->d . '일 전';
if ($diff->h > 0) return $diff->h . '시간 전';
if ($diff->i > 0) return $diff->i . '분 전';
return $diff->s . '초 전';
}
사용법은
echo timeAgo("날짜", "단위(입력안해도 됨)");
echo timeAgo("2024-11-10 09:09:00", "hour");
hour 는 입력 하지 않으면 기본으로 몇일전까지 출력되며 변경 원하면 옵션으로 넣으시면 됩니다.
이렇게 입력하면 시간 단위 현재(2024-11-10 11:38분) 기준으로 2시간전 이렇게 나옵니다.
조금 더 예제를 만들어보면 아래와 같이 날짜와 단위별로 테스트해보겠습니다.
// 테스트용 날짜 데이터
$test_dates = [
'2024-11-10 10:59:30', // 30초 전
'2024-11-10 10:55:00', // 5분 전
'2024-11-10 09:00:00', // 2시간 전
'2024-11-10 03:00:00', // 8시간 전
'2024-11-09 11:00:00', // 1일 전
'2024-11-07 11:00:00', // 3일 전
'2024-11-03 11:00:00', // 7일 전
'2024-10-10 11:00:00', // 1개월 전
'2024-08-10 11:00:00', // 3개월 전
'2023-11-10 11:00:00', // 1년 전
'2022-11-10 11:00:00' // 2년 전
];
// 각 제한 단위별로 테스트
$limit_units = ['minute', 'hour', 'day', 'month', 'year'];
foreach ($limit_units as $limit) {
echo "<h3>[ {$limit} 단위 기준 ]</h3>";
echo "<div style='margin-left: 20px;'>";
foreach ($test_dates as $date) {
echo "<div style='margin-bottom: 8px;'>";
echo "<strong>{$date}</strong> → " . timeAgo($date, $limit);
echo "</div>";
}
echo "</div><br>";
}
테스트 시점 날짜는 2024-11-10 11:30입니다.
[ minute 단위 기준 ]
2024-11-10 10:59:30 → 30분 전
2024-11-10 10:55:00 → 35분 전
2024-11-10 09:00:00 → 2024-11-10 09:00
2024-11-10 03:00:00 → 2024-11-10 03:00
2024-11-09 11:00:00 → 2024-11-09 11:00
2024-11-07 11:00:00 → 2024-11-07 11:00
2024-11-03 11:00:00 → 2024-11-03 11:00
2024-10-10 11:00:00 → 2024-10-10 11:00
2024-08-10 11:00:00 → 2024-08-10 11:00
2023-11-10 11:00:00 → 2023-11-10 11:00
2022-11-10 11:00:00 → 2022-11-10 11:00
[ hour 단위 기준 ]
2024-11-10 10:59:30 → 30분 전
2024-11-10 10:55:00 → 35분 전
2024-11-10 09:00:00 → 2시간 전
2024-11-10 03:00:00 → 8시간 전
2024-11-09 11:00:00 → 2024-11-09 11:00
2024-11-07 11:00:00 → 2024-11-07 11:00
2024-11-03 11:00:00 → 2024-11-03 11:00
2024-10-10 11:00:00 → 2024-10-10 11:00
2024-08-10 11:00:00 → 2024-08-10 11:00
2023-11-10 11:00:00 → 2023-11-10 11:00
2022-11-10 11:00:00 → 2022-11-10 11:00
[ day 단위 기준 ]
2024-11-10 10:59:30 → 30분 전
2024-11-10 10:55:00 → 35분 전
2024-11-10 09:00:00 → 2시간 전
2024-11-10 03:00:00 → 8시간 전
2024-11-09 11:00:00 → 1일 전
2024-11-07 11:00:00 → 3일 전
2024-11-03 11:00:00 → 7일 전
2024-10-10 11:00:00 → 2024-10-10 11:00
2024-08-10 11:00:00 → 2024-08-10 11:00
2023-11-10 11:00:00 → 2023-11-10 11:00
2022-11-10 11:00:00 → 2022-11-10 11:00
[ month 단위 기준 ]
2024-11-10 10:59:30 → 30분 전
2024-11-10 10:55:00 → 35분 전
2024-11-10 09:00:00 → 2시간 전
2024-11-10 03:00:00 → 8시간 전
2024-11-09 11:00:00 → 1일 전
2024-11-07 11:00:00 → 3일 전
2024-11-03 11:00:00 → 7일 전
2024-10-10 11:00:00 → 1개월 전
2024-08-10 11:00:00 → 3개월 전
2023-11-10 11:00:00 → 2023-11-10 11:00
2022-11-10 11:00:00 → 2022-11-10 11:00
[ year 단위 기준 ]
2024-11-10 10:59:30 → 30분 전
2024-11-10 10:55:00 → 35분 전
2024-11-10 09:00:00 → 2시간 전
2024-11-10 03:00:00 → 8시간 전
2024-11-09 11:00:00 → 1일 전
2024-11-07 11:00:00 → 3일 전
2024-11-03 11:00:00 → 7일 전
2024-10-10 11:00:00 → 1개월 전
2024-08-10 11:00:00 → 3개월 전
2023-11-10 11:00:00 → 1년 전
2022-11-10 11:00:00 → 2년 전
위와 같은 형태로 출력됩니다.
반응형
'PHP' 카테고리의 다른 글
유튜브 주소에서 유튜브 영상 아이디 가져오기 (1) | 2024.11.15 |
---|---|
두 날짜 사이의 날짜들을 배열로 반환 하는 함수 (0) | 2024.11.14 |
PHP에서 $_SERVER 변수에 대한 설명 (0) | 2024.11.09 |
100일 뒤 날짜구하기, 특정 날짜 구하기 (0) | 2023.11.19 |
Notice: Use of undefined constant 오류 (0) | 2013.02.11 |