2016年3月6日 星期日

Parse ISO 8601 duration 的方法

ISO 8601 Duration是ISO 8601的Duration標準,是用來表示持續時間的字串,例如
"P3Y6M4DT12H30M5S" 就表示 "3年6個月4天12小時又30分5秒",
像Youtube A{I回傳的影片長度就是用這個標準的字串來表示,
在Java中,除了自己想辨法解析外,也可以使用以下的方法:
  1. 在Java 1.8之後,只要使用java.time.Duration這個Class就可以輕易地解析由ISO 8601 Duration表示的持續時間,範例程式如下:
  2. import java.time.Duration;
    import java.text.NumberFormat;
    import java.text.DecimalFormat;
    
    public class HelloWorld
    {
      public static void main(String[] args)
      {
        Duration duration = Duration.parse("PT58S");
        NumberFormat formatter = new DecimalFormat("00");
    
        String hours = formatter.format(duration.toHours());
        String minutes = formatter.format(duration.toMinutes());
        String seconds = formatter.format(duration.getSeconds());
    
        System.out.print(hours + ":" + minutes + ":" + seconds); //00:00:58
      }
    }

  3. 而在Java 1.8之前,因為沒有java.time.Duration,所以可以借助第三方的Class,在這邊介紹一個很好用的第三方JAR,joda-time,到官網下載引用後,就可以使用它的Period, PeriodFormatter, ISOPeriodFormater等Class來幫助我們解析ISO 8601 Duration,範例程式如下:
  4. import java.text.DecimalFormat;
    import java.text.NumberFormat;
    import org.joda.time.Period;
    import org.joda.time.format.ISOPeriodFormat;
    import org.joda.time.format.PeriodFormatter;
    
    public class DurationTest {
    
     public DurationTest() {
      // TODO Auto-generated constructor stub
     }
    
     public static void main(String[] args) {
      PeriodFormatter periodformatter = ISOPeriodFormat.standard();
      Period p = periodformatter.parsePeriod("PT58S");
      NumberFormat numberformatter = new DecimalFormat("00");  
    
      String hours = numberformatter.format(p.getHours());
      String minutes = numberformatter.format(p.getMinutes());
      String seconds = numberformatter.format(p.getSeconds());
    
      System.out.println(hours + ":" + minutes + ":" + seconds); //00:00:58
     }
    }
參考資料:
  1. How to convert Youtube API V3 duration in Java

沒有留言 :

張貼留言