루젠소프트 로고

TODAY : 9,141

기술문서

 > 

PHP

초를 동영상 재생 시간 (ISO 8601 형식) 으로 변환하는 함수

초를 동영상 재생 시간 (ISO 8601 형식) 으로 변환하는 함수
평점 10.0 라이센스 free
사용자평점 10.0 운영체제
다운로드 0 파일크기 0
제작사 LUZENSOFT 등록일 2025-06-08 16:52:41
- 설명

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의 DateTimeDateInterval 객체를 사용하여 ISO 8601 형식의 기간을 계산합니다.

  1. 음수 처리: 입력된 초가 음수일 경우 InvalidArgumentException을 발생시켜 오류를 명확히 합니다.

  2. DateTime 객체 생성:

    • new DateTime('@' . $seconds, new DateTimeZone('UTC')): 입력된 $seconds 값을 Unix 타임스탬프(초)로 해석하여 DateTime 객체를 생성합니다. UTC 시간대를 명시하여 시간대 변환으로 인한 오류를 방지합니다.

    • new DateTime('@0', new DateTimeZone('UTC')): 기준점 역할을 할 0초 DateTime 객체를 생성합니다.

  3. DateInterval 계산:

    • $dtStart->diff($dt): DateTime 객체 간의 차이를 계산하여 DateInterval 객체를 반환합니다. 이 객체에는 시간, 분, 초 등의 정보가 포함되어 있습니다.

  4. 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초