在java中将Youtube数据API V3视频持续时间转换为hh:mm:ss格式?

在java中将Youtube数据API V3视频持续时间转换为hh:mm:ss格式?,java,regex,youtube-data-api,Java,Regex,Youtube Data Api,我正在使用Youtube data api v3获取视频信息,如标题、视图计数和持续时间。持续时间值对我来说是新的,因为它是ISO8601日期,我需要将其转换为可读格式,如hh:mm:ss。持续时间可以有以下不同的值: PT1S-->00:01 PT1M-->01:00 PT1H-->01:00:00 PT1M1S-->01:01 PT1H1S-->01:00:01 PT1H1M1S-->01:01:01 我可以使用解析值并以秒为单位计算持续时间,但库的大小为500kb,这将增加我不想要的应用程

我正在使用Youtube data api v3获取视频信息,如标题、视图计数和持续时间。持续时间值对我来说是新的,因为它是
ISO8601日期
,我需要将其转换为可读格式,如hh:mm:ss。持续时间可以有以下不同的值:

  • PT1S-->00:01
  • PT1M-->01:00
  • PT1H-->01:00:00
  • PT1M1S-->01:01
  • PT1H1S-->01:00:01
  • PT1H1M1S-->01:01:01
  • 我可以使用解析值并以秒为单位计算持续时间,但库的大小为500kb,这将增加我不想要的应用程序的大小。

    查看以下代码:

    private static HashMap<String, String> regexMap = new HashMap<>();
    private static String regex2two = "(?<=[^\\d])(\\d)(?=[^\\d])";
    private static String two = "0$1";
    
    public static void main(String[] args) {
    
        regexMap.put("PT(\\d\\d)S", "00:$1");
        regexMap.put("PT(\\d\\d)M", "$1:00");
        regexMap.put("PT(\\d\\d)H", "$1:00:00");
        regexMap.put("PT(\\d\\d)M(\\d\\d)S", "$1:$2");
        regexMap.put("PT(\\d\\d)H(\\d\\d)S", "$1:00:$2");
        regexMap.put("PT(\\d\\d)H(\\d\\d)M", "$1:$2:00");
        regexMap.put("PT(\\d\\d)H(\\d\\d)M(\\d\\d)S", "$1:$2:$3");
    
        String[] dates = { "PT1S", "PT1M", "PT1H", "PT1M1S", "PT1H1S", "PT1H1M", "PT1H1M1S", "PT10H1M13S", "PT10H1S", "PT1M11S" };
    
        for (String date : dates) {
            String d = date.replaceAll(regex2two, two);
            String regex = getRegex(d);
            if (regex == null) {
                System.out.println(d + ": invalid");
                continue;
            }
            String newDate = d.replaceAll(regex, regexMap.get(regex));
            System.out.println(date + " : " +newDate);
        }    
    }
    
    private static String getRegex(String date) {
        for (String r : regexMap.keySet())
            if (Pattern.matches(r, date))
                return r;
        return null;
    }
    
    private static HashMap regexMap=new HashMap();
    
    私有静态字符串regex2two=“(?也必须处理此问题。我必须将长度转换为毫秒,但一旦填充了secs/mins/hours变量,就可以转换为任何格式:

    // Test Value
    $vidLength = 'PT1H23M45S';
    
    $secs = '';
    $mins = '';
    $hours = '';
    $inspecting = '';
    for($i=(strlen($vidLength)-1); $i>0; $i--){
        if(is_numeric($vidLength[$i])){
            if($inspecting == 'S'){
                $secs = $vidLength[$i].$secs;
            }
            else if($inspecting == 'M'){
                $mins = $vidLength[$i].$mins;
            }
            else if($inspecting == 'H'){
                $hours = $vidLength[$i].$hours;
            }
        }
        else {
            $inspecting = $vidLength[$i];
        }
    }
    
    $lengthInMS = 1000*(($hours*60*60) + ($mins*60) + $secs); 
    
    我自己做的

    让我们试试看

    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.GregorianCalendar;
    import java.util.
    
    public class YouTubeDurationUtils {
        /**
         * 
         * @param duration
         * @return "01:02:30"
         */
        public static String convertYouTubeDuration(String duration) {
            String youtubeDuration = duration; //"PT1H2M30S"; // "PT1M13S";
            Calendar c = new GregorianCalendar();
            try {
                DateFormat df = new SimpleDateFormat("'PT'mm'M'ss'S'");
                Date d = df.parse(youtubeDuration);
                c.setTime(d);
            } catch (ParseException e) {
                try {
                    DateFormat df = new SimpleDateFormat("'PT'hh'H'mm'M'ss'S'");
                    Date d = df.parse(youtubeDuration);
                    c.setTime(d);
                } catch (ParseException e1) {
                    try {
                        DateFormat df = new SimpleDateFormat("'PT'ss'S'");
                        Date d = df.parse(youtubeDuration);
                        c.setTime(d);
                    } catch (ParseException e2) {
                    }
                }
            }
            c.setTimeZone(TimeZone.getDefault());
    
            String time = "";
            if ( c.get(Calendar.HOUR) > 0 ) {
                if ( String.valueOf(c.get(Calendar.HOUR)).length() == 1 ) {
                    time += "0" + c.get(Calendar.HOUR);
                }
                else {
                    time += c.get(Calendar.HOUR);
                }
                time += ":";
            }
            // test minute
            if ( String.valueOf(c.get(Calendar.MINUTE)).length() == 1 ) {
                time += "0" + c.get(Calendar.MINUTE);
            }
            else {
                time += c.get(Calendar.MINUTE);
            }
            time += ":";
            // test second
            if ( String.valueOf(c.get(Calendar.SECOND)).length() == 1 ) {
                time += "0" + c.get(Calendar.SECOND);
            }
            else {
                time += c.get(Calendar.SECOND);
            }
            return time ;
        }
    }
    

    我需要一个包含所有这些转换的持续时间的数组,所以我写了下面的代码作为解决方法,而且java.time.duration对我不起作用,不知道为什么

    String[] D_uration = new String[10];
    while(iteratorSearchResults.hasNext()){String Apiduration1=Apiduration.replace("PT","");
                                if(Apiduration.indexOf("H")>=0){
                                    String Apiduration2=Apiduration1.replace("H",":");
                                    if(Apiduration.indexOf("M")>=0){
                                        String Apiduration3=Apiduration2.replace("M",":");
                                        if(Apiduration.indexOf("S")>=0){
                                            D_uration[i]=Apiduration3.replace("S","");
    
    
                                        }
                                        else{
                                            String Apiduration4=Apiduration2.replace("M",":00");
                                            D_uration[i]=Apiduration4;
                                        }
                                    }
                                    else{
                                        String Apiduration4=Apiduration2.replace(":",":00:");
                                        if(Apiduration.indexOf("S")>=0){
                                            D_uration[i]=Apiduration4.replace("S","");
    
    
                                        }
                                        else{
                                            String Apiduration3=Apiduration4.replace(":00:",":00:00");
                                            D_uration[i]=Apiduration3;
                                        }
                                    }
                                }
                                else{
    
                                    if(Apiduration.indexOf("M")>=0){
                                        String Apiduration2=Apiduration1.replace("M",":");
                                        if(Apiduration.indexOf("S")>=0){
                                            D_uration[i]=Apiduration2.replace("S","");
    
    
                                        }
                                        else{
                                            String Apiduration4=Apiduration2.replace(":",":00");
                                            D_uration[i]=Apiduration4;
                                        }
    
                                    }
                                    else{
    
                                        D_uration[i]=Apiduration1.replace("S","");
    
    
    
    
                                    }
                                }
    
    “Apiduration”由Youtube数据Api以ISO8601格式返回


    现在做了一些编辑,我想应该可以了。

    这是最好的解决方案,到目前为止:)看看我的答案