将以下格式的时间转换为小时。输入是时间格式可以数以下是任何类似的
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
正则表达式。当你有很多不同的后缀选项时(例如hour
和hr
时间字段),这是很有用的:
/** * 小时 * * @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