如何從字串決議 LocalTime,例如 mm:ss.S 格式的“10:38.0”。我很難改變格式。
public static LocalTime parseTime(String time) {
return localTime = LocalTime.parse(time, DateTimeFormatter.ofPattern("mm:ss.S"));
}
獲取錯誤
java.time.format.Parsed 型別的 ISO java.time.format.DateTimeParseException:無法決議文本“10:38.2”:無法從 TemporalAccessor 獲取 LocalTime:{MinuteOfHour=10, MicroOfSecond=200000, MilliOfSecond=200, NanoOfSecond =200000000,SecondOfMinute=38},
uj5u.com熱心網友回復:
java.time.Duration.parse()
正如其他幾個人正確而明智地指出的那樣,您的示例字串10:38.0看起來更像是一段時間,一段持續時間。不像一天中午夜后 10 分鐘多一點的時間。所以LocalTime不是在這里使用的正確類。使用Duration. 并將字串決議為Duration物件。
不過,Duration該類僅支持決議 ISO 8601 格式。ISO 8601 格式持續PT10M38.0S10 分 38.0 秒(或者例如PT10M38S或PT10M38.00000S,它們也可以作業)。有更多方法可以克服此限制。Arvind Kumar Avinash 已經在他的回答中展示了一個。我的方法是在決議之前轉換字串:
public static Duration parseTime(String time) {
String iso = time.replaceFirst("^(\\d ):(\\d (?:\\.\\d*)?)$", "PT$1M$2S");
return Duration.parse(iso);
}
讓我們試試看:
Duration dur = parseTime("10:38.0");
System.out.println(dur);
輸出是:
PT10M38S
您會看到Duration列印件也以 ISO 8601 格式回傳。
根據您想要的進一步處理,您可能會在該類的檔案中找到許多有用的方法;下方鏈接。
如何time.replaceFirst("^(\\d ):(\\d (?:\\.\\d*)?)$", "PT$1M$2S")作業:我使用的是正則運算式匹配您的字串:
^: 匹配字串的開頭。(\\d ):匹配一個或多個數字的捕獲組。圓括號表示捕獲組。我將在下面的替換中需要此功能。:: 一個冒號(確實)。(\\d (?:\\.\\d*)?):捕獲數字組,可選地后跟一個點和零個或多個其他數字。(?:表示我使用的非捕獲組的開始,因為我不需要在替換中單獨使用它。?在非捕獲組之后表示它是可選的(因此38沒有分數也可以在幾秒鐘內作業)。$: 匹配字串的結尾
在我的替換字串中,PT$1M$2S,$1和$2表示第一個和第二個捕獲組行進的任何內容,即插入10和38.0到結果字串中以獲取PT10M38.0S.
鏈接
- 維基百科文章:ISO 8601
- Java 正則運算式的檔案
- 檔案
Duration
uj5u.com熱心網友回復:
問題是,mm:ss不是真正的當地時間。這更像是一個短跑比賽時間。發生錯誤是因為翻譯需要 # of hours 的值,并且沒有可用的值(“無小時”在此處解釋為:它們不在模式中,而不是:“它們丟失了,因此假設有 0小時”)。
解決這個問題的一種黑客方法是將您的模式更改為[HH:]mm:ss-[]指示可選輸入。現在意改變:僅僅10:20被解釋為(通過可選的輸入方面)的簡寫00:10:20,并且是可決議成一個本地時間。
但是,也許LocalTime不是你在這里尋找的東西;如果這確實描述了測量事件所用的時間,那么您正在尋找Duration,而不是LocalTime。不幸的是,決議10:20為 10 分 20 秒的持續時間并非易事,API 只是不支持它(從DTFormatter物件到達那里的唯一方法是通過LocalTime,足夠瘋狂)。
uj5u.com熱心網友回復:
DateTimeFormatterBuilder#parseDefaulting
您可以使用DateTimeFormatterBuilder#parseDefaulting將一天中的小時默認為零。
但是,在常識中,10:38.0代表一個持續時間。您可以Duration通過查找 parsedLocalTime和之間的持續時間來獲取物件LocalTime.MIN。
演示:
import java.time.Duration;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
String str = "10:38.0";
DateTimeFormatter dtf = new DateTimeFormatterBuilder()
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.appendPattern("mm:ss.S")
.toFormatter(Locale.ENGLISH);
LocalTime time = LocalTime.parse(str, dtf);
System.out.println(time);
Duration duration = Duration.between(LocalTime.MIN, time);
System.out.println(duration);
}
}
輸出:
00:10:38
PT10M38S
ONLINE DEMO
從Trail: Date Time 中了解有關現代日期時間 API * 的更多資訊。
* 如果您正在為 Android 專案作業并且您的 Android API 級別仍然不符合 Java-8,請檢查通過 desugaring 可用的 Java 8 API。請注意,Android 8.0 Oreo 已提供對java.time.
uj5u.com熱心網友回復:
我相信你想要: .ofPattern("H:mm.s")
public static LocalTime parseTime(String time) {
return LocalTime.parse(time, DateTimeFormatter.ofPattern("H:mm.s"));
}
https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html
uj5u.com熱心網友回復:
a) 類mm:ss.S無法決議像without hours這樣的運算式,DateTimeFormatter因為這樣的決議器試圖將其解釋為時間點,而不是持續時間。缺少的小時是將結果決議為 的實體的固定要求LocalTime。
b) 您可能想要一個持續時間,而不是LocalTime. 嗯,java.time確實有一個名為的類,java.time.Duration但它只能格式化和決議類似 ISO-8601 的運算式的子集,例如:PT10M38.2S不支持您想要的模式。對不起。
c) 有些人提出了一種折衷方案:解釋LocalTime為一種持續時間(不是真的!)然后用默認的小時值決議運算式,最后評估小時的分鐘和分鐘的秒等。但是,只有在您永遠不會獲得大于 59 分鐘或 59 秒的時間分量值時,這樣的變通方法才有效。
d) 我的外部庫Time4J支持基于模式的列印和持續時間決議。使用類net.time4j.Duration.Formatter 的示例:
@Test
public void example() throws ParseException {
TemporalAmount ta =
Duration.formatter(ClockUnit.class, "mm:ss.f")
.parse("10:38.2")
.toTemporalAmount();
System.out.println(LocalTime.of(5, 0).plus(ta)); // 05:10:38.200
}
該示例還演示了LocalTime通過轉換方法連接到 Java-8 類的橋梁toTemporalAmount()。如果您net.time4j.PlainTime改為使用,則當然不需要橋接。
此外,當運算式包含不適合標準時鐘方案(如 10 分 68 秒(= 11 分鐘 8 秒))的時間分量時,time4j-duration-class 的許多特征之一是受控規范化的。
@Test
public void example2() throws ParseException {
net.time4j.Duration dur =
Duration.formatter(ClockUnit.class, "mm:ss.f")
.parse("10:68.2")
.with(Duration.STD_CLOCK_PERIOD); // normalizing
System.out.println(PlainTime.of(5, 0).plus(dur)); // 05:11:08.200
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/345810.html
