我有一個格式爲hh:mm:ss
的字符串。這是一個電話的時間。LocalDateTime在幾秒鐘內
我想在幾秒鐘內獲得該通話的持續時間。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm:ss");
LocalDateTime time = LocalDateTime.parse(timeStr, formatter);
如何從LocalDateTime獲得以秒爲單位的持續時間?
我有一個格式爲hh:mm:ss
的字符串。這是一個電話的時間。LocalDateTime在幾秒鐘內
我想在幾秒鐘內獲得該通話的持續時間。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm:ss");
LocalDateTime time = LocalDateTime.parse(timeStr, formatter);
如何從LocalDateTime獲得以秒爲單位的持續時間?
沒有日期部分,所以你可以簡單地使用LocalTime
,雖然LocalTime
並非真正設計代表持續時間:
String input = "01:52:27";
LocalTime time = LocalTime.parse(input);
int seconds = time.toSecondOfDay();
請注意,這僅適用於最長爲23:59:59
的持續時間。
一個更好的辦法是使用Duration
類 - 請注意,它也將配合較長的持續時間:
//convert first to a valid Duration representation
String durationStr = input.replaceAll("(\\d+):(\\d+):(\\d+)", "PT$1H$2M$3S");
Duration duration = Duration.parse(durationStr);
int seconds = duration.getSeconds();
不知道是否有什麼東西在建,但下面應該做的工作:
private long getSecondDuration(LocalDateTime t) {
long h = t.getHour();
long m = t.getMinute();
long s = t.getSecond();
return (h * 3600) + (m * 60) + s;
}
沒有必要將其轉換爲LocalDateTime
,我們可以直接從字符串得到秒。
試着用冒號拆分它,得到最後一個元素。
或者,如果你正在尋找的總秒,乘以相應的各部分:
String time = "10:15:34";
String[] sections = time.split(":");
int seconds = Integer.parseInt(sections[2]);
int totalSeconds =
(Integer.parseInt(sections[0]) * 60 * 60) +
(Integer.parseInt(sections[1]) * 60) +
(Integer.parseInt(sections[2]));
System.out.println("Seconds: " + seconds);
System.out.println("Total seconds: " + totalSeconds);
我將開始與Pattern
,測試如果String
匹配正則表達式模式(例如用冒號分隔的三組數字)並構建一個Duration
,類似於
Pattern p = Pattern.compile("(\\d+):(\\d+):(\\d+)");
Matcher m = p.matcher(timeStr);
if (m.matches()) {
int hours = Integer.parseInt(m.group(1));
int minutes = Integer.parseInt(m.group(2));
int seconds = Integer.parseInt(m.group(3));
Duration d = Duration.ofHours(hours).plusMinutes(minutes).plusSeconds(seconds);
System.out.println(d.getSeconds());
}
LocalDateTime
是一個Temporal
這些代表一個時間點,而不是持續時間。
雖然「1:30:00」可以被解釋爲一個點和一個持續時間,但語義是不同的。
的一個原因,這是非常重要的是,「25: 30:02「是有效的持續時間,但不是有效的時間。
Java 8有一個java.time.Duration
類。
如果你能依靠你輸入的字符串是有效的,可以很容易地割裂開來:
String[] parts = durationAsString.split(":");
Duration duration = Duration
.ofHours(Long.parseLong(parts[0]))
.plusMinutes(Long.parseLong(parts[1]))
.plusSeconds(Long.parseLong(parts[2]));
(如果你不能依賴於輸入是有效的,無論是與正則表達式預驗證,或添加代碼來處理parts.length != 3
並解析來自parseLong
的異常)
檢查Javadoc的Duration
以瞭解您可以使用它做什麼。一種方法是getSeconds()
它給你的總持續時間以秒爲單位。
你也可以使用一個Duration
隨着LocalTime
,LocalDateTime
等等 - 有方法的Duration
添加到時間來獲得一個新的時間;從另一個Temporal
中減去一個Duration
等等。
有可能Duration
比您需要更復雜。如果你真的只需要轉換「1時30分十秒」到秒,有什麼不對自己做的數學:
String[] parts = durationAsString.split(":");
long seconds =
Long.parseLong(parts[0]) * 60 * 60 +
Long.parseLong(parts[1]) * 60 +
Long.parseLong(parts[2]);
不要讓一個LocalDateTime對象出來。它會像baaos的回答一樣工作,但這是一種非常奇怪的思路,因爲你正在談論一個持續時間,並將它放入一個應該在特定的日,月和年保持固定時間的對象。儘管該方法仍被稱爲「toSecondOfDay()」,但它可能會讓試圖閱讀您的代碼的人感到困惑,但assylas向您展示了一種更好的方式。這就是爲什麼我會採取Okx的方式。 – Mark