Java将字符串日期转换为秒

时间:2014-11-25 00:31:17

标签: java regex date

我有一些意见:

1h50m22s
2h40m10s
33m03s

我必须在java中转换为秒。

已经使用正则表达式提取数字' \ d + | \ \ D +'。

3 个答案:

答案 0 :(得分:3)

约达时间

不要重新发明轮子。 Joda-Time库可以为您解析这些值。不需要正则表达式。

ISO 8601

这些值接近标准ISO 8601格式。特别是Durations格式,PnYnMnDTnHnMnSP标记开头,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;