초를 동영상 재생 시간 (ISO 8601 형식) 으로 변환하는 함수
2025. 6. 8. 16:51ㆍ프로그램/PHP 초급
PHP로 초를 ISO 8601 형식의 동영상 재생 시간으로 변환하는 함수는 다음과 같습니다.
PHP
<?php
/**
* 초를 ISO 8601 형식의 동영상 재생 시간으로 변환합니다.
*
* @param int $seconds 변환할 총 초 단위 시간.
* @return string ISO 8601 형식의 시간 문자열 (PTnHnMnS).
*/
function convertSecondsToISO8601Duration(int $seconds): string {
if ($seconds < 0) {
throw new InvalidArgumentException("시간은 음수일 수 없습니다.");
}
$dt = new DateTime('@' . $seconds, new DateTimeZone('UTC'));
$dtStart = new DateTime('@0', new DateTimeZone('UTC'));
$interval = $dtStart->diff($dt);
$duration = 'PT';
if ($interval->h > 0) {
$duration .= $interval->h . 'H';
}
if ($interval->i > 0) {
$duration .= $interval->i . 'M';
}
if ($interval->s > 0 || ($interval->h === 0 && $interval->i === 0)) { // 0초인 경우에도 '0S'를 포함
$duration .= $interval->s . 'S';
}
// 만약 H, M, S 아무것도 없는 0초인 경우, PT0S로 처리
if ($duration === 'PT') {
$duration = 'PT0S';
}
return $duration;
}
// 사용 예시
echo convertSecondsToISO8601Duration(0) . "\n"; // PT0S
echo convertSecondsToISO8601Duration(5) . "\n"; // PT5S
echo convertSecondsToISO8601Duration(60) . "\n"; // PT1M
echo convertSecondsToISO8601Duration(65) . "\n"; // PT1M5S
echo convertSecondsToISO8601Duration(3600) . "\n"; // PT1H
echo convertSecondsToISO8601Duration(3605) . "\n"; // PT1H5S
echo convertSecondsToISO8601Duration(3665) . "\n"; // PT1H1M5S
echo convertSecondsToISO8601Duration(90000) . "\n"; // PT25H
echo convertSecondsToISO8601Duration(123456) . "\n"; // PT34H17M36S
// 음수 입력 시 예외 처리
try {
echo convertSecondsToISO8601Duration(-10) . "\n";
} catch (InvalidArgumentException $e) {
echo "에러: " . $e->getMessage() . "\n";
}
?>
함수 설명
이 함수는 PHP의 DateTime 및 DateInterval 객체를 사용하여 ISO 8601 형식의 기간을 계산합니다.
- 음수 처리: 입력된 초가 음수일 경우 InvalidArgumentException을 발생시켜 오류를 명확히 합니다.
- DateTime 객체 생성:
- new DateTime('@' . $seconds, new DateTimeZone('UTC')): 입력된 $seconds 값을 Unix 타임스탬프(초)로 해석하여 DateTime 객체를 생성합니다. UTC 시간대를 명시하여 시간대 변환으로 인한 오류를 방지합니다.
- new DateTime('@0', new DateTimeZone('UTC')): 기준점 역할을 할 0초 DateTime 객체를 생성합니다.
- DateInterval 계산:
- $dtStart->diff($dt): DateTime 객체 간의 차이를 계산하여 DateInterval 객체를 반환합니다. 이 객체에는 시간, 분, 초 등의 정보가 포함되어 있습니다.
- ISO 8601 형식 구성:
- $duration = 'PT';: ISO 8601 기간은 항상 P (기간)으로 시작하고, 그 뒤에 T (시간 구성 요소)가 옵니다.
- $interval->h, $interval->i, $interval->s: DateInterval 객체에서 시간(hour), 분(minute), 초(second) 값을 가져옵니다.
- if ($interval->h > 0) { $duration .= $interval->h . 'H'; }: 시간이 0보다 크면 nH 형식으로 추가합니다.
- if ($interval->i > 0) { $duration .= $interval->i . 'M'; }: 분이 0보다 크면 nM 형식으로 추가합니다.
- if ($interval->s > 0 || ($interval->h === 0 && $interval->i === 0)) { $duration .= $interval->s . 'S'; }: 초가 0보다 크거나 (총 시간이) 시간과 분이 모두 0인 경우(즉, 0초인 경우) nS 형식으로 추가합니다. 이렇게 하면 PT0S와 같은 출력을 보장합니다.
- if ($duration === 'PT') { $duration = 'PT0S'; }: 만약 모든 시간 구성 요소가 0이어서 PT만 남게 되면, 이를 PT0S로 재설정하여 올바른 ISO 8601 형식을 유지합니다.
ISO 8601 기간 형식
ISO 8601 기간 형식은 일반적으로 P로 시작하며, 그 뒤에 기간을 나타내는 구성 요소가 옵니다. 시간 구성 요소는 T로 시작하며, 각 요소는 숫자와 함께 단위를 나타내는 문자를 사용합니다.
- P (기간)
- T (시간 구성 요소의 시작)
- H (시간)
- M (분)
- S (초)
예시:
- PT0S: 0초
- PT30S: 30초
- PT1M: 1분
- PT1M30S: 1분 30초
- PT1H: 1시간
- PT1H30M: 1시간 30분
- PT1H30M15S: 1시간 30분 15초
'프로그램 > PHP 초급' 카테고리의 다른 글
| 📚 PHP 강의: PHP란 무엇인가? (0) | 2025.06.25 |
|---|---|
| 📚 PHP 강의 커리큘럼 (0) | 2025.06.24 |
| 방대한 자료를 LIKE 검색을 하는데 부하를 줄일수 있는 방법 (0) | 2025.06.06 |
| macOS에서 파일 업로드 시 발생하는 한글 자소 분리 문제를 해결 (0) | 2025.06.04 |
| PHP 함수가 있는지 체크하고 정의 하는 방법 (0) | 2025.06.04 |