How to convert Youtube API V3 duration in Java

2019-03-18 02:18发布

The Youtube V3 API uses ISO8601 time format to describe the duration of videos. Something likes "PT1M13S". And now I want to convert the string to the number of seconds (for example 73 in this case).

Is there any Java library can help me easily do the task under Java 6? Or I have to do the regex task by myself?

Edit

Finally I accept the answer from @Joachim Sauer

The sample code with Joda is as below.

PeriodFormatter formatter = ISOPeriodFormat.standard();
Period p = formatter.parsePeriod("PT1H1M13S");
Seconds s = p.toStandardSeconds();

System.out.println(s.getSeconds());

13条回答
趁早两清
2楼-- · 2019-03-18 02:37

And yet another long way to do the same.

// PT1H9M24S -->  1:09:24
// PT2H1S"   -->  2:00:01
// PT23M2S   -->  23:02
// PT31S     -->  0:31

public String convertDuration(String duration) {
    duration = duration.substring(2);  // del. PT-symbols
    String H, M, S;
    // Get Hours:
    int indOfH = duration.indexOf("H");  // position of H-symbol
    if (indOfH > -1) {  // there is H-symbol
        H = duration.substring(0,indOfH);      // take number for hours
        duration = duration.substring(indOfH); // del. hours
        duration = duration.replace("H","");   // del. H-symbol
    } else {
        H = "";
    }
    // Get Minutes:
    int indOfM = duration.indexOf("M");  // position of M-symbol
    if (indOfM > -1) {  // there is M-symbol
        M = duration.substring(0,indOfM);      // take number for minutes
        duration = duration.substring(indOfM); // del. minutes
        duration = duration.replace("M","");   // del. M-symbol
        // If there was H-symbol and less than 10 minutes
        // then add left "0" to the minutes
        if (H.length() > 0 && M.length() == 1) {
            M = "0" + M;
        }
    } else {
        // If there was H-symbol then set "00" for the minutes
        // otherwise set "0"
        if (H.length() > 0) {
            M = "00";
        } else {
            M = "0";
        }
    }
    // Get Seconds:
    int indOfS = duration.indexOf("S");  // position of S-symbol
    if (indOfS > -1) {  // there is S-symbol
        S = duration.substring(0,indOfS);      // take number for seconds
        duration = duration.substring(indOfS); // del. seconds
        duration = duration.replace("S","");   // del. S-symbol
        if (S.length() == 1) {
            S = "0" + S;
        }
    } else {
        S = "00";
    }
    if (H.length() > 0) {
        return H + ":" +  M + ":" + S;
    } else {
        return M + ":" + S;
    }
}
查看更多
仙女界的扛把子
3楼-- · 2019-03-18 02:40

Here is my solution

public class MyDateFromat{
    public static void main(String args[]){
        String ytdate = "PT1H1M15S";
        String result = ytdate.replace("PT","").replace("H",":").replace("M",":").replace("S","");
        String arr[]=result.split(":");
        String timeString = String.format("%d:%02d:%02d", Integer.parseInt(arr[0]), Integer.parseInt(arr[1]),Integer.parseInt(arr[2]));
        System.out.print(timeString);       
    }
}

It will return a string in H:MM:SS format if you want to convert in seconds you can use

int timeInSedonds = int timeInSecond = Integer.parseInt(arr[0])*3600 + Integer.parseInt(arr[1])*60 +Integer.parseInt(arr[2])

Note: it can throw exception so please handle it based on size of result.split(":");

查看更多
Rolldiameter
4楼-- · 2019-03-18 02:44

In case you can be pretty sure about the validity of the input and can't use regex, I use this code (returns in miliseconds):

Integer parseYTDuration(char[] dStr) {
    Integer d = 0;

    for (int i = 0; i < dStr.length; i++) {
        if (Character.isDigit(dStr[i])) {
            String digitStr = "";
            digitStr += dStr[i];
            i++;
            while (Character.isDigit(dStr[i])) {
                digitStr += dStr[i];
                i++;
            }

            Integer digit = Integer.valueOf(digitStr);

            if (dStr[i] == 'H')
                d += digit * 3600;
            else if (dStr[i] == 'M')
                d += digit * 60;
            else
                d += digit;
        }
    }

    return d * 1000;
}
查看更多
Deceive 欺骗
5楼-- · 2019-03-18 02:45

You can use the standart SimpleDateFormat to parse the String to a Date and process it from there:

DateFormat df = new SimpleDateFormat("'PT'mm'M'ss'S'");
String youtubeDuration = "PT1M13S";
Date d = df.parse(youtubeDuration);
Calendar c = new GregorianCalendar();
c.setTime(d);
c.setTimeZone(TimeZone.getDefault());
System.out.println(c.get(Calendar.MINUTE));
System.out.println(c.get(Calendar.SECOND));
查看更多
家丑人穷心不美
6楼-- · 2019-03-18 02:46

I did by myself

Let's try

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 ;
    }
}
查看更多
Ridiculous、
7楼-- · 2019-03-18 02:48

The question Converting ISO 8601-compliant String to java.util.Date contains another solution:

The easier solution is possibly to use the data type converter in JAXB, since JAXB must be able to parse ISO8601 date string according to the XML Schema specification. javax.xml.bind.DatatypeConverter.parseDateTime("2010-01-01T12:00:00Z") will give you a Calendar object and you can simply use getTime() on it, if you need a Date object.

查看更多
登录 后发表回答