Java 将小时,分钟,秒转换为小时

将以下格式的时间转换为小时。输入是时间格式可以数以下是任何类似的

1 hour 30 mins 20 secs 
2 hrs 10 mins 
45 mins

而我的输出将是:

1.5052.1670.75

方法一

您可以使用PeriodFormatterBuilder类和使用appendSuffix方法为每个字段定义单数和复数值的后缀:

import org.joda.time.Period;
import org.joda.time.format.PeriodFormatter;
import org.joda.time.format.PeriodFormatterBuilder;

/**
 * 小时
 *
 * @param input
 */
public static void getPeriod(String input) {
      PeriodFormatter formatter = new PeriodFormatterBuilder()
            .appendHours().appendSuffix("hour", "hours")    // 小时(单数和复数后缀)
            .appendMinutes().appendSuffix("min", "mins")
            .appendSeconds().appendSuffix("sec", "secs")
            .toFormatter();

    //删除空格并将“hr”更改为“hour”
    Period p = formatter.parsePeriod(input.replaceAll(" ", "").replaceAll("hr", "hour"));

    double hours = p.getHours();
    hours += p.getMinutes() / 60d;
    hours += p.getSeconds() / 3600d;

    System.out.println(hours);
}

public static void main(String[] args) {
    getPeriod("1 hour 30 mins 20 secs");
    getPeriod("2 hrs 10 mins");
    getPeriod("45 mins");
}

输出:

1.5055555555555555 
2.1666666666666665 
0.75

方法二

另一种创建方法PeriodFormatter是使用appendSuffix正则表达式。当你有很多不同的后缀选项时(例如hourhr时间字段),这是很有用的:

/**
 * 小时
 *
 * @param input
 */
public static void getPeriod(String input) {
    PeriodFormatter formatter = new PeriodFormatterBuilder()
            .appendHours()
            .appendSuffix(
                    new String[]{"^1$", ".*", "^1$", ".*"},
                    new String[]{" hour", " hours", " hr", " hrs"})
            // optional space (if there are more fields)
            .appendSeparatorIfFieldsBefore(" ")
            .appendMinutes().appendSuffix(" min", " mins")
            // optional space (if there are more fields)
            .appendSeparatorIfFieldsBefore(" ")
            .appendSeconds().appendSuffix(" sec", " secs")
            .toFormatter();

    // no need to call replaceAll (take input just as it is)
    Period p = formatter.parsePeriod(input);

    double hours = p.getHours();
    hours += p.getMinutes() / 60d;
    hours += p.getSeconds() / 3600d;

    System.out.println(hours);
}

请注意,我还添加appendSeparatorIfFieldsBefore(" ")了指示它在下一个字段之前有一个空格。

这个版本的好处是你不需要预处理输入:

// no need to call replaceAll (take input just as it is)Period p = formatter.parsePeriod(input);

输出与上面相同。

方法三、

Java 8日期时间API,使用这个java.time.Duration类:

public void getDuration(String input) {
    // replace hour/min/secs strings for H, M and S
    String adjusted = input.replaceAll("\\s*(hour|hr)s?\\s*", "H");
    adjusted = adjusted.replaceAll("\\s*mins?\\s*", "M");
    adjusted = adjusted.replaceAll("\\s*secs?\\s*", "S");
    Duration d = Duration.parse("PT" + adjusted);

    double hours = d.toMillis() / 3600000d;
    System.out.println(hours);}//testsgetDuration("1 hour 30 mins 20 secs");getDuration("2 hrs 10 mins");getDuration("45 mins");

输出是一样的。

PS:如果您的Java版本<= 7,则可以使用ThreeTen Backport。类名和方法是一样的,唯一的区别是包名:org.threeten.bp而不是java.time

译文:https://stackoverflow.com/questions/44376970/convert-hours-mins-secs-string-to-hours


赞(52) 打赏
未经允许不得转载:优客志 » JAVA开发
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏