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

AEF*_*AEF 2 java duration date

我有一个来自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;
}
Run Code Online (Sandbox Code Playgroud)

fda*_*f22 5

这些字符串(例如PT5H27M)表示持续时间,而不是日期:

  • 日期表示某个日历系统中的特定点,例如"2017年3月25日上午10点"
  • 持续时间表示介入时间的数量,例如"5小时27分钟"

虽然日期代表一个特定的时刻,但是任何日历系统根本不会附加持续时间(相对于什么时刻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();
Run Code Online (Sandbox Code Playgroud)

在Java 7或更低版​​本中,您可以使用Threeten Backport :(它包含具有相同名称和功能的类).