ISO 8601 期間(Duration)変換ツール

ISO 8601の期間表記(例: PT1H30M)と秒数を相互変換します。YouTube APIの動画長やAWSのタイムアウト設定、ポッドキャストのRSSフィードなどでも使われるこの期間形式を、素早く解読・生成できる開発者向けの無料ツールです。

ISO 8601 期間表記の代表例

ISO 8601の期間(Duration)表記は「P」に続けて年・月・日を、「T」に続けて時・分・秒を並べる形式です。以下は代表的な表記とそれが表す秒数の対応表です。

期間表記 合計秒数 備考
PT30S 30 30秒間のタイムアウトなど、短い時間指定の代表例
PT1H30M 5,400 1時間30分。映画の上映時間やYouTube動画の長さを表す際によく使われる形式
P1D 86,400 1日(24時間)。サーバーログの保持期間やキャッシュの有効期限指定に使われる
P3Y6M4DT12H30M5S 110,842,205 3年6ヶ月4日12時間30分5秒に相当する複合表記の例(年・月は365.25日/年の近似値で換算)

使い方のヒント

  • 年・月を含む期間は、実際には暦によって日数が変動するため、本ツールでは1年=365.25日、1ヶ月=30.44日という固定の近似値で秒数に換算しています。
  • 秒数から期間文字列を生成する際、「日時分秒のみ」モードを選ぶと年・月の近似を一切使わず、うるう年等の誤差がない厳密な表記が得られます。
  • YouTube Data APIの動画情報(contentDetails.duration)はISO 8601形式で返されるため、本ツールにそのまま貼り付けて秒数に変換できます。
  • AWS Lambda・API Gatewayなどクラウドサービスのタイムアウト設定にISO 8601期間表記が使われる場合があり、設定値の検証に便利です。
  • ポッドキャストのRSSフィードで音声の長さを表す際、hh:mm:ss形式に加えてISO 8601期間形式が使われることがあります。

よくある質問

PT1H30Mは「1時間30分」を表すISO 8601の期間(Duration)表記です。"P"は期間の開始を示す記号(Period)、"T"は時刻部分(時・分・秒)の開始を示す記号で、"T"がないと"1M"は「1ヶ月」、"T"の後にある"1M"は「1分」という意味になる点に注意が必要です。

代表的な例として、YouTube Data APIの動画の長さ(contentDetails.duration)、AWSやGoogle Cloudなど各種クラウドサービスのタイムアウト・有効期限設定、ポッドキャストのRSSフィード(itunes:duration)などがあります。プログラミング言語ではJavaのDuration/Period、PythonのisodateライブラリなどがISO 8601期間の解析・生成に対応しています。

1年はうるう年か平年かで365日または366日、1ヶ月は28日から31日まで月によって日数が異なるため、「1年=何秒」という固定値は本来存在しません。本ツールでは実用上の目安として、うるう年を平均化した365.25日を1年、その12分の1(約30.44日)を1ヶ月として換算しています。正確な期間を扱いたい場合は、年月を使わず日・時・分・秒のみで表現する「厳密値」モードの利用をおすすめします。

はい。"P2W"(2週間)のようなW表記にも対応しています。ただしISO 8601の仕様上、W表記は年月日や時刻部分と組み合わせることができない単独の省略記法である点にご注意ください。

"P"で始まっていない、単位の順序がY→M→D・H→M→Sの順になっていない、あるいはすべての単位が省略された空の期間などを入力した場合、本ツールは変換不能と判断してエラーメッセージを表示します。
ツールくん

余談ですが ― なぜコンピューターの世界に「期間」を表す専用フォーマットがあるのか

ISO 8601は本来「日時」を国際的に統一したフォーマットで表すための規格として知られていますが、実は「期間(Duration)」、つまり2つの時点の間の長さを表す記法も同じ規格の中で定義されています。日時が「いつなのか」という1点を指すのに対し、期間は「どれだけの長さか」という差分の情報であり、両者は似ているようで扱うべき情報の性質がまったく異なります。この違いを明確にするために、期間専用の"P"から始まる記法が用意されました。

期間表記が実務で重宝される理由の1つは、プログラム間でデータをやり取りする際に、単位の解釈違いによるバグを防げる点にあります。例えば「30」という数値だけをAPIレスポンスに含めた場合、それが秒なのか分なのかは呼び出し側が別途ドキュメントを確認しない限り分かりません。一方"PT30S"であれば、値と単位が1つの文字列にセットで含まれているため、パースする側の実装が正しければ解釈を誤りようがありません。

YouTube Data APIが動画の長さをISO 8601形式で返すのも同じ理由です。"PT4M13S"という文字列を見れば、それが4分13秒の動画であることが一意に定まります。同様にAWSやGoogle CloudのAPIでもタイムアウトや有効期限の設定にこの形式が採用されることがあり、クラウドサービスのYAML設定ファイルやJSONレスポンスの中でこの記法を見かけたら、本ツールで秒数に変換して具体的な長さを確認するとイメージが掴みやすくなります。

一方でこの規格には、年・月を含む期間が「絶対的な長さ」を持たないという興味深い性質があります。同じ"P1Y"でも、うるう年をまたぐかどうかで実際の日数が365日にも366日にもなり得るのです。本ツールが年月を含む変換に近似値を使わざるを得ないのも、突き詰めればこの仕様上の曖昧さに起因しています。