如何从java中的时间句子中提取分钟数?e、 g xx小时xx分钟

如何从java中的时间句子中提取分钟数?e、 g xx小时xx分钟,java,Java,我知道这个标题令人困惑,但我想不出更好的了 假设我有一个字符串,看起来像([number]hr(s))[number]min(s) 例如1分钟,15分钟,3小时50分钟,1小时15分钟,4小时1分钟等 如何有效地从这些字符串中提取分钟数?我希望它也考虑到小时,因此3小时50分钟将产生230。我唯一能想到的就是使用大量的if子句和regex,但我想知道是否有更有效的方法。如果您的时间是X小时Y分钟 String time = "3 hrs 10 min"; String[] parts = tim

我知道这个标题令人困惑,但我想不出更好的了

假设我有一个字符串,看起来像
([number]hr(s))[number]min(s)

例如
1分钟
15分钟
3小时50分钟
1小时15分钟
4小时1分钟


如何有效地从这些字符串中提取分钟数?我希望它也考虑到小时,因此
3小时50分钟
将产生
230
。我唯一能想到的就是使用大量的if子句和regex,但我想知道是否有更有效的方法。

如果您的时间是X小时Y分钟

String time = "3 hrs 10 min";
String[] parts = time.split(" ");
int total = Integer.parseInt(parts[0]) * 60 + Integer.parseInt(parts[2]);
这个等待将给你一个小时的字符串,乘以60分钟,再加上分钟。如果你只需要几分钟,那就只需参与其中[2]


如果你的时间是X小时Y分钟,你也可以使用正则表达式

String time = "3 hrs 10 min";
String[] parts = time.split(" ");
int total = Integer.parseInt(parts[0]) * 60 + Integer.parseInt(parts[2]);
这个等待将给你一个小时的字符串,乘以60分钟,再加上分钟。如果你只需要几分钟,那就只需参与其中[2]


您也可以使用正则表达式

这里有一个正则表达式解决方案:

((\d+)\s*(hours|hrs|hr|h)\s*)?(\d\d?)\s*(minutes|mins|min|m)
分钟数:

minutes = $1 * 60 + $4
规则:

  • 你必须提供分钟,即使是一个小时
  • 您可以省略小时,因此
    1分钟
    相当于
    0小时1分钟
  • 如果模式不匹配,则格式无效
  • 为获得最佳结果,请使用不区分大小写的匹配(通常
    i
    选项)

操场:

这里有一个正则表达式解决方案:

((\d+)\s*(hours|hrs|hr|h)\s*)?(\d\d?)\s*(minutes|mins|min|m)
分钟数:

minutes = $1 * 60 + $4
规则:

  • 你必须提供分钟,即使是一个小时
  • 您可以省略小时,因此
    1分钟
    相当于
    0小时1分钟
  • 如果模式不匹配,则格式无效
  • 为获得最佳结果,请使用不区分大小写的匹配(通常
    i
    选项)

操场:

您可以使用以下代码,希望对您有所帮助

String time="3 hrs 50 mins";
    String[] array = time.split(" ");
    int minutes = 0;
    if(array.length>2){  // if it has minute and hour content 
        minutes = Integer.parseInt(array[0])*60 + Integer.parseInt(array[2]);
    } else{  // if time has only minute content
        minutes = Integer.parseInt(array[0]);
    }

您可以使用以下代码,希望对您有所帮助

String time="3 hrs 50 mins";
    String[] array = time.split(" ");
    int minutes = 0;
    if(array.length>2){  // if it has minute and hour content 
        minutes = Integer.parseInt(array[0])*60 + Integer.parseInt(array[2]);
    } else{  // if time has only minute content
        minutes = Integer.parseInt(array[0]);
    }

另一种方法为您提供了更大的灵活性:

public long getMinutes(String input) {
    input = input.toLowerCase()
                 .replaceAll("mins?", "M") 
                 .replaceAll("hrs?", "H")
                 .replaceAll("\\s+", "");
    Duration d = Duration.parse("PT" + input);
    return d.toMinutes();
}
()

样本数据的输出:

1 min: 1
15 mins: 15
3 hrs 50 mins: 230
1 hr 15 mins: 75
4 hrs 1 min: 241
基本思想是将您的输入转换为Java方法(
PTHM
)支持的字符串,然后让它发挥神奇的作用。最终会得到一个
Duration
对象,该对象提供了以后处理它的各种方法

请注意,这将打印
230
,打印时间为
3小时50分钟
。如果您只需要
50
,那么简单的正则表达式将是更简单的方法


(在生产代码中,我会将各种
replaceAll
调用合并为一个调用,并将
toLowerCase
替换为不区分大小写的模式匹配,以提高效率。为了更好地理解,将其明确保留在此处。)

另一种方法为您提供了更大的灵活性:

public long getMinutes(String input) {
    input = input.toLowerCase()
                 .replaceAll("mins?", "M") 
                 .replaceAll("hrs?", "H")
                 .replaceAll("\\s+", "");
    Duration d = Duration.parse("PT" + input);
    return d.toMinutes();
}
()

样本数据的输出:

1 min: 1
15 mins: 15
3 hrs 50 mins: 230
1 hr 15 mins: 75
4 hrs 1 min: 241
基本思想是将您的输入转换为Java方法(
PTHM
)支持的字符串,然后让它发挥神奇的作用。最终会得到一个
Duration
对象,该对象提供了以后处理它的各种方法

请注意,这将打印
230
,打印时间为
3小时50分钟
。如果您只需要
50
,那么简单的正则表达式将是更简单的方法



(在生产代码中,我会将各种
replaceAll
调用合并为一个调用,并将
toLowerCase
替换为不区分大小写的模式匹配,以提高效率。为了更好地理解,这里将其显式保留。)

用空格分隔
字符串怎么样?您应该花一些时间来查看。你可能会自己想出一些东西……如果你只对小时的一小部分感兴趣,那么你对
3小时50分钟
-
50
230
会有什么期望呢?正则表达式
(\d+\s+min?
会捕获你所有的例子。我将把它留作一个练习,让您在Java中实现它。您可以添加测试输入和预期输出吗???用空格分隔
字符串如何?您应该花一些时间来检查测试提供的许多方法。你可能会自己想出一些东西……如果你只对小时的一小部分感兴趣,那么你对
3小时50分钟
-
50
230
会有什么期望呢?正则表达式
(\d+\s+min?
会捕获你所有的例子。我将把它留作一个练习,让您在Java中实现它。您可以添加测试输入和预期输出吗???除了这段代码不会编译之外,如果只给它几分钟,它就不会工作。这段代码似乎是用python和Java的混合体编写的。Java是静态类型的!!更新!我在想打字,却忘了写。谢谢你的评论,只给了他一个例子,我想他可以通过文档找到答案,搜索split除了这段代码不会编译之外,如果只给几分钟就不会工作。这段代码似乎是用python和Java的混合体编写的。Java是静态类型的!!更新!我在想打字,却忘了写。谢谢你的评论,并且只给了他一个例子,我想他可以通过doc找到答案,搜索
持续时间
。小的改进建议:在替换任何内容之前,对输入字符串使用
toLowerCase()
。通过这种方式,此算法还将支持
Hrs
Hrs
Mins
@HubertGrzeskowiak:Done,谢谢!ItamarG3:也谢谢你-我更进一步,把点对齐了。非常好地使用了
持续时间
。小的改进建议:在替换任何内容之前,对输入字符串使用
toLowerCase()
。这样,这个算法也将支持语法l