mirror of
https://github.com/androidx/media.git
synced 2025-05-09 16:40:55 +08:00
Support negative-fronted xs:duration values.
Issue: 186
This commit is contained in:
parent
fc8c08d240
commit
6f1832fb66
@ -55,7 +55,7 @@ public final class Util {
|
||||
+ "([Zz]|((\\+|\\-)(\\d\\d):(\\d\\d)))?");
|
||||
|
||||
private static final Pattern XS_DURATION_PATTERN =
|
||||
Pattern.compile("^P(([0-9]*)Y)?(([0-9]*)M)?(([0-9]*)D)?"
|
||||
Pattern.compile("^(-)?P(([0-9]*)Y)?(([0-9]*)M)?(([0-9]*)D)?"
|
||||
+ "(T(([0-9]*)H)?(([0-9]*)M)?(([0-9.]*)S)?)?$");
|
||||
|
||||
private Util() {}
|
||||
@ -275,21 +275,23 @@ public final class Util {
|
||||
public static long parseXsDuration(String value) {
|
||||
Matcher matcher = XS_DURATION_PATTERN.matcher(value);
|
||||
if (matcher.matches()) {
|
||||
boolean negated = !TextUtils.isEmpty(matcher.group(1));
|
||||
// Durations containing years and months aren't completely defined. We assume there are
|
||||
// 30.4368 days in a month, and 365.242 days in a year.
|
||||
String years = matcher.group(2);
|
||||
String years = matcher.group(3);
|
||||
double durationSeconds = (years != null) ? Double.parseDouble(years) * 31556908 : 0;
|
||||
String months = matcher.group(4);
|
||||
String months = matcher.group(5);
|
||||
durationSeconds += (months != null) ? Double.parseDouble(months) * 2629739 : 0;
|
||||
String days = matcher.group(6);
|
||||
String days = matcher.group(7);
|
||||
durationSeconds += (days != null) ? Double.parseDouble(days) * 86400 : 0;
|
||||
String hours = matcher.group(9);
|
||||
String hours = matcher.group(10);
|
||||
durationSeconds += (hours != null) ? Double.parseDouble(hours) * 3600 : 0;
|
||||
String minutes = matcher.group(11);
|
||||
String minutes = matcher.group(12);
|
||||
durationSeconds += (minutes != null) ? Double.parseDouble(minutes) * 60 : 0;
|
||||
String seconds = matcher.group(13);
|
||||
String seconds = matcher.group(14);
|
||||
durationSeconds += (seconds != null) ? Double.parseDouble(seconds) : 0;
|
||||
return (long) (durationSeconds * 1000);
|
||||
long durationMillis = (long) (durationSeconds * 1000);
|
||||
return negated ? -durationMillis : durationMillis;
|
||||
} else {
|
||||
return (long) (Double.parseDouble(value) * 3600 * 1000);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user