我有一些意见:
1h50m22s
2h40m10s
33m03s
我必须在java中转换为秒。
已经使用正则表达式提取数字' \ d + | \ \ D +'。
答案 0 :(得分:3)
不要重新发明轮子。 Joda-Time库可以为您解析这些值。不需要正则表达式。
这些值接近标准ISO 8601格式。特别是Durations格式,PnYnMnDTnHnMnS
。 P
标记开头,T
将日期部分与时间位置分开。如果您只有时间值,则只需将PT
添加到PT33m03s
前面。最后转换为大写以获得PT33M03S
。
Joda-Time默认解析并生成此类字符串。输入为标准格式后,您可以直接将其传递给Joda-Time。跳过正则表达式。
或者,您可以指定PeriodFormatter
以适合您的确切输入字符串。然后,您可以解析原始输入字符串,而无需转换为标准格式。
如果您对输入字符串的来源有任何控制或影响,我强烈建议更改该源以使用ISO 8601格式。
Period
Class 接下来,使用Period
类自动将该值解析为Period对象。期间表示一个时间跨度,以月,日,小时等为单位。 不与宇宙历史时间轴上的点相关联。 (如果时间轴上有特定点,请使用Interval
类。)
Duration
Class 接下来,致电toStandardDuration
以获取Duration
个对象。 Joda-Time中的持续时间表示一段时间,只是时间的流逝。仅仅是几毫秒,而不是特定的月数或小时数或这样的块。
最后,在该持续时间对象上调用getStandardSeconds
以获得答案。
比处理正则表达式容易得多。更可靠的是,Joda-Time已经构建,调试,磨损,并且能够处理可能的输入字符串的各种排列。
使用Joda-Time 2.5。
简洁版(不推荐)。
String input = ( "PT" + "33m03s" ).toUpperCase();
long durationInSeconds = Period.parse( input ).toStandardDuration().getStandardSeconds();
详细版本。
// Convert input string to standard ISO 8601 format.
// Alternatively, you could use a formatter to parse your original string rather than convert.
String inputRaw = "33m03s";
String inputStandard = "PT" + inputRaw; // Assuming this is a time-only without date portion, prepend 'PT' to make standard ISO 8601 format.
inputStandard = inputStandard.toUpperCase();
// Parse string as Period object.
Period period = Period.parse( inputStandard );
// Convert from Period to Duration to extract total seconds.
Duration duration = period.toStandardDuration();
long durationInSeconds = duration.getStandardSeconds(); // Returns getMillis() / 1000. The result is an integer division, so 2999 millis returns 2 seconds.
转储到控制台。
System.out.println( "inputRaw : " + inputRaw );
System.out.println( "inputStandard : " + inputStandard );
System.out.println( "period : " + period ); // Notice how the leading zero on the 'seconds' number is gone. We have a Period *object*, not messing with strings.
System.out.println( "duration : " + duration );
System.out.println( "durationInSeconds : " + durationInSeconds );
跑步时。
inputRaw : 33m03s
inputStandard : PT33M03S
period : PT33M3S
duration : PT1983S
durationInSeconds : 1983
答案 1 :(得分:1)
您可以使用Joda-Time轻松完成。
首先使用Pattern类来提取字段:
Pattern pattern = Pattern.compile("(?:(\\d+)h)?(?:(\\d+)m)?(?:(\\d+)s)?");
Matcher matcher = pattern.matcher("1h50m22s");
matcher.matches();
String hours = matcher.group(1);
String minutes = matcher.group(2);
String seconds = matcher.group(3);
Period period = new Period();
if(hours != null){
period = period.withHours(Integer.parseInt(hours));
}
if(minutes != null){
period = period.withMinutes(Integer.parseInt(minutes));
}
if(seconds != null){
period = period.withSeconds(Integer.parseInt(seconds));
}
int totalSeconds = period.toStandardSeconds().getSeconds();
使用PeriodFormatterBuilder类(解析模式的灵活性较低):
String dateText = "1h50m22s";
PeriodFormatterBuilder formatterBuilder = new PeriodFormatterBuilder();
if(dateText.contains("h")){
formatterBuilder.appendHours().appendLiteral("h");
}
if(dateText.contains("m")){
formatterBuilder.appendMinutes().appendLiteral("m");
}
if(dateText.contains("s")){
formatterBuilder.appendSeconds().appendLiteral("s");
}
Period period = formatterBuilder.toFormatter().parsePeriod(dateText);
int totalSeconds = period.toStandardSeconds().getSeconds();
答案 2 :(得分:0)
您可能希望使用String的substring方法提取所需的数字并将其解析为整数。例如,只需要几秒钟即可完成:
String time = "32h45m93s";
String seconds = time.substring(time.indexOf('m') + 1, time.indexOf('s'));
int seconds = Integer.parseInt(seconds);
我没有运行它,但这是一般的想法。用小时和分钟做同样的事情
int totalSeconds = hours * 3600 + minutes * 60 + seconds;