通常我不會推薦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
。
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(" ")
以表明它有下一個前場的空間:當你有很多的後綴不同的選項(如hour
和hr
的時間字段)這是非常有用的。
關於這個版本的好處是,你不需要預先處理輸入:
// 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版本是< = 7,您可以使用ThreeTen Backport。類名和方法是相同的,唯一的區別是包名稱:org.threeten.bp
而不是java.time
。
有一個thrird黨庫** ** JNLP自然語言處理,但是這將是矯枉過正。 –
你檢查了喬達時間嗎?它具有包含這種可能性的週期分析功能。 – RealSkeptic
使用小數來表示以小時爲單位的時間跨度是不明智的。我建議你查看[ISO 8601](https://en.wikipedia.org/wiki/ISO_8601#Durations)標準格式的持續時間,並查看java.time類['Duration'](https:// docs.oracle.com/javase/8/docs/api/java/time/Duration.html)。 'java.time.Duration.parse(「PT1H30M20S」)' –