我有一个来自API的字符串,它给了我旅行的持续时间。
PT5H27M
PT5H
PT27M
我想从中获得Date
变量。
我通过使用模式和匹配器编写了一些函数,但是当我的旅行列表很长时,它需要很长时间。 你能给我一个更好的方法吗? 我在下面附上了我的代码:
final Pattern p = Pattern.compile("PT(\\d*)H*(\\d*)M*");
private long getDurationOfTrip(Pattern pattern,String duration){
long durationOfTrip = 0 ;
Matcher m = pattern.matcher(duration);
if (m.find()){
if (duration.contains("H")&&duration.contains("M"))
durationOfTrip = (Long.parseLong(m.group(1))*60) + Long.parseLong(m.group(2));
else if (duration.contains("H")&& !duration.contains("M"))
durationOfTrip = (Long.parseLong(m.group(1))*60);
else
durationOfTrip = Long.parseLong(m.group(1));
}
return durationOfTrip;
}
答案 0 :(得分:5)
这些字符串(例如PT5H27M
)代表duration,不日期:
虽然日期代表特定时刻,但任何日历系统都没有附加时间(相对于什么时刻5小时27分钟?没关系,只是时间强>)。
日期可能有时会处理持续时间,但你不应该这样做,因为这些是不同的概念(虽然相关,但它们不是同一个东西)。
无论如何,在Java 8或更高版本中,只需使用java.time.Duration
类来解析字符串,然后使用toXXX
方法之一来获得所需单位的总持续时间(在您的情况下,您正在计算总分钟数,因此请使用toMinutes
方法:
Duration duration = Duration.parse("PT5H27M");
// get the total number of minutes (in this case, 327)
long minutes = duration.toMinutes();
在Java 7或更低版本中,您可以使用Threeten Backport :(它包含具有相同名称和功能的类)。
答案 1 :(得分:1)
关于正则表达式,使用略微修改的模式PT(?:(\\d+)H)?(?:(\\d+)M)?
和自定义parseLong函数可能会更短
static long parseLong( String s ) {
return s == null || "".equals( s ) ? 0 : Long.parseLong( s );
}
static long getDurationOfTrip( Pattern pattern, String duration ) {
long durationOfTrip = 0;
Matcher m = pattern.matcher( duration );
if ( m.find() ) {
return parseLong( m.group( 1 ) ) * 60 + parseLong( m.group( 2 ) );
}
return durationOfTrip;
}