java 中具有特定模式的字符串

String with specific pattern to Date in java

我有一个来自 API 的字符串,它告诉我旅行的持续时间。

我想从中得到一个 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;
}

这些字符串(比如PT5H27M)代表一个duration,是不是一个日期:

  • 一个日期代表某些日历系统中的特定点,例如"March 25th 2017 at 10 AM"
  • 持续时间表示中间的时间量,例如“5小时27分钟”

虽然日期表示特定时刻,但持续时间根本不附加到任何日历系统(相对于什么时刻的 5 小时 27 分钟?没关系,它只是一个 数量时间).

将持续时间视为日期可能有时可行,但您不应该这样做,因为它们是不同的概念(虽然相关,但它们不是一回事)。

无论如何,在Java 8或更高版本中,只需使用java.time.Duration class解析字符串,然后使用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:(它包含具有相同名称和功能的 classes)。

关于正则表达式,使用稍微修改过的模式 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;
}