通常我不会推荐 Joda-Time(因为它正在被新的 Java API 取代),但它是我所知道的唯一一个具有良好的句点格式化程序/解析器的 API。
您可以使用PeriodFormatterBuilder 类并使用appendSuffix 方法为每个字段定义单复数的后缀:
import org.joda.time.Period;
import org.joda.time.format.PeriodFormatter;
import org.joda.time.format.PeriodFormatterBuilder;
// method to parse the period
public void getPeriod(String input) {
PeriodFormatter formatter = new PeriodFormatterBuilder()
// hours (singular and plural suffixes)
.appendHours().appendSuffix("hour", "hours")
// minutes
.appendMinutes().appendSuffix("min", "mins")
// seconds
.appendSeconds().appendSuffix("sec", "secs")
// create formatter
.toFormatter();
// remove spaces and change "hr" to "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);
}
// tests
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),它很有用:
PeriodFormatter formatter = new PeriodFormatterBuilder()
// hours (all possible suffixes for singular and plural)
.appendHours()
.appendSuffix(
// regular expressions for singular and plural
new String[] { "^1$", ".*", "^1$", ".*" },
// possible suffixes for singular and plural
new String[] { " hour", " hours", " hr", " hrs" })
// optional space (if there are more fields)
.appendSeparatorIfFieldsBefore(" ")
// minutes
.appendMinutes().appendSuffix(" min", " mins")
// optional space (if there are more fields)
.appendSeparatorIfFieldsBefore(" ")
// seconds
.appendSeconds().appendSuffix(" sec", " secs")
// create formatter
.toFormatter();
请注意,我还添加了appendSeparatorIfFieldsBefore(" ") 以表明它在下一个字段之前有一个空格。
这个版本的好处是你不需要对输入进行预处理:
// no need to call replaceAll (take input just as it is)
Period p = formatter.parsePeriod(input);
输出同上。
Java 8 日期时间 API
如@assylian's answer 中所述,您可以使用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);
}
//tests
getDuration("1 hour 30 mins 20 secs");
getDuration("2 hrs 10 mins");
getDuration("45 mins");
输出是一样的。
PS:如果你的 Java 版本是 ThreeTen Backport。类名和方法都是一样的,唯一不同的是包名:org.threeten.bp而不是java.time。