5935


YouTube Data APIで得られる動画の再生時間はISO 8601形式に従って`PT#M#S`という`String`型のデータで返されます｡
そこで質問なのですが表示する上でJavaを使ってこの文字列を`hh:MM:ss`という形式に変換したいと考えています｡そこで何か簡単な方法はありますでしょうか｡

よろしくおねがいします｡

**追記:**

YouTube Data
APIの[リソース表現](https://developers.google.com/youtube/v3/docs/videos?hl=ja#resource)です｡
再生時間は`contentDetails`の`duration`という項目です｡


CC BY-SA 3.0
2015-02-04T07:29:31.220
5930
2015-02-04T08:19:14.753
2015-02-04T07:57:42.053
7232
7232
question
java youtube-data-api
JavaでString型のISO 8601文字列を整形したい｡


自分でパースしてもいいぐらいに簡単なフォーマットではありますが、きちんとしたものがほしければ、 [Joda-
Time](http://www.joda.org/joda-time/index.html) に良いパーサ (
[ISOPeriodFormat](http://joda-
time.sourceforge.net/apidocs/org/joda/time/format/ISOPeriodFormat.html) )
が含まれています。

_PT_M_S.java:_

[code]

    public class PT_M_S {
    
        public static void main( String[] args) {
            final PeriodFormatter parser = ISOPeriodFormat.standard();
            final PeriodFormatter fmt = new PeriodFormatterBuilder()
                .printZeroAlways().minimumPrintedDigits(2).appendHours().appendSeparator(":")
                .printZeroAlways().minimumPrintedDigits(2).appendMinutes().appendSeparator(":")
                .printZeroAlways().minimumPrintedDigits(2).appendSeconds().toFormatter();
    
            final Period pt10m30s = parser.parsePeriod( "PT10M30S");
            final Period pt1m2s = parser.parsePeriod( "PT1M2S");
            final Period pt1h2m3s = parser.parsePeriod( "PT01H2M3S");
    
            System.out.println(pt10m30s + 
                " = " + pt10m30s.toStandardSeconds() + 
                " = " + pt10m30s.toStandardDuration().getMillis() +
                " = " + fmt.print( pt10m30s));
    
            System.out.println(pt1m2s + 
                " = " + pt1m2s.toStandardSeconds() + 
                " = " + pt1m2s.toStandardDuration().getMillis() +
                " = " + fmt.print( pt1m2s));
    
            System.out.println(pt1h2m3s + 
                " = " + pt1h2m3s.toStandardSeconds() + 
                " = " + pt1h2m3s.toStandardDuration().getMillis() +
                " = " + fmt.print( pt1h2m3s));
        }
    
    }
    
[/code]

_Output:_

[code]

    PT10M30S = PT630S = 630000 = 00:10:30
    PT1M2S = PT62S = 62000 = 00:01:02
    PT1H2M3S = PT3723S = 3723000 = 01:02:03
    
[/code]


CC BY-SA 3.0
2015-02-04T08:16:41.570
5935
2015-02-04T08:16:41.570
4978
5930
answer


Java 8
なら、[Duration](https://docs.oracle.com/javase/jp/8/api/java/time/Duration.html)が使えそうです。

[code]

    import java.time.*;
    import java.time.temporal.*;
    public class DurationTest {
      public static void main(String... args) {
        String text = "PT5M30S";
        Duration d = Duration.parse(text);
        long seconds = d.get(ChronoUnit.SECONDS);
        long hours = seconds / 3600;
        int minutes = (int) ((seconds % 3600) / 60);
        int secs = (int) (seconds % 60);
        System.out.format("%s => %d:%d:%d", text, hours, minutes, secs);
      }
    }
    
[/code]


CC BY-SA 3.0
2015-02-04T08:19:14.753
5936
2015-02-04T08:19:14.753
46
5930
answer