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
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));
May be this would help some one who don't want any library but a simple function,
String duration="PT1H11M14S";
This is the function,
private String getTimeFromString(String duration) {
// TODO Auto-generated method stub
String time = "";
boolean hourexists = false, minutesexists = false, secondsexists = false;
if (duration.contains("H"))
hourexists = true;
if (duration.contains("M"))
minutesexists = true;
if (duration.contains("S"))
secondsexists = true;
if (hourexists) {
String hour = "";
hour = duration.substring(duration.indexOf("T") + 1,
duration.indexOf("H"));
if (hour.length() == 1)
hour = "0" + hour;
time += hour + ":";
}
if (minutesexists) {
String minutes = "";
if (hourexists)
minutes = duration.substring(duration.indexOf("H") + 1,
duration.indexOf("M"));
else
minutes = duration.substring(duration.indexOf("T") + 1,
duration.indexOf("M"));
if (minutes.length() == 1)
minutes = "0" + minutes;
time += minutes + ":";
} else {
time += "00:";
}
if (secondsexists) {
String seconds = "";
if (hourexists) {
if (minutesexists)
seconds = duration.substring(duration.indexOf("M") + 1,
duration.indexOf("S"));
else
seconds = duration.substring(duration.indexOf("H") + 1,
duration.indexOf("S"));
} else if (minutesexists)
seconds = duration.substring(duration.indexOf("M") + 1,
duration.indexOf("S"));
else
seconds = duration.substring(duration.indexOf("T") + 1,
duration.indexOf("S"));
if (seconds.length() == 1)
seconds = "0" + seconds;
time += seconds;
}
return time;
}
I have written and used this method to get the actual duration. Hope this helps.
private String parseDuration(String duration) {
duration = duration.contains("PT") ? duration.replace("PT", "") : duration;
duration = duration.contains("S") ? duration.replace("S", "") : duration;
duration = duration.contains("H") ? duration.replace("H", ":") : duration;
duration = duration.contains("M") ? duration.replace("M", ":") : duration;
String[] split = duration.split(":");
for(int i = 0; i< split.length; i++){
String item = split[i];
split[i] = item.length() <= 1 ? "0"+item : item;
}
return TextUtils.join(":", split);
}
Joda Time is the go-to library for time-related functions of any kind.
For this specific case ISOPeriodFormat.standard() returns a PeriodFormatter that can parse and format that format.
The resulting object is a Period (JavaDoc). Getting the actual number of seconds would then be period.toStandardSeconds().getSeconds()
, but I suggest you just handle the duration as a Period
object (for ease of handling and for type safety).
Edit: a note from future me: this answer is several years old now. Java 8 brought java.time.Duration
along which can also parse this format and doesn't require an external library.
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 ;
}
}
Using this website:
// URL that generated this code:
// http://txt2re.com/index-java.php3?s=PT1M13S&6&3&18&20&-19&-21
import java.util.regex.*;
class Main
{
public static void main(String[] args)
{
String txt="PT1M13S";
String re1="(P)"; // Any Single Character 1
String re2="(T)"; // Any Single Character 2
String re3="(\\d+)"; // Integer Number 1
String re4="(M)"; // Any Single Character 3
String re5="(\\d+)"; // Integer Number 2
String re6="(S)"; // Any Single Character 4
Pattern p = Pattern.compile(re1+re2+re3+re4+re5+re6,Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
Matcher m = p.matcher(txt);
if (m.find())
{
String c1=m.group(1);
String c2=m.group(2);
String minutes=m.group(3); // Minutes are here
String c3=m.group(4);
String seconds=m.group(5); // Seconds are here
String c4=m.group(6);
System.out.print("("+c1.toString()+")"+"("+c2.toString()+")"+"("+minutes.toString()+")"+"("+c3.toString()+")"+"("+seconds.toString()+")"+"("+c4.toString()+")"+"\n");
int totalSeconds = Integer.parseInt(minutes) * 60 + Integer.parseInt(seconds);
}
}
}