2017-06-20 145 views
0

我有一個格式爲hh:mm:ss的字符串。這是一個電話的時間。LocalDateTime在幾秒鐘內

我想在幾秒鐘內獲得該通話的持續時間。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm:ss"); 
LocalDateTime time = LocalDateTime.parse(timeStr, formatter); 

如何從LocalDateTime獲得以秒爲單位的持續時間?

+0

不要讓一個LocalDateTime對象出來。它會像baaos的回答一樣工作,但這是一種非常奇怪的思路,因爲你正在談論一個持續時間,並將它放入一個應該在特定的日,月和年保持固定時間的對象。儘管該方法仍被稱爲「toSecondOfDay()」,但它可能會讓試圖閱讀您的代碼的人感到困惑,但assylas向您展示了一種更好的方式。這就是爲什麼我會採取Okx的方式。 – Mark

回答

7

沒有日期部分,所以你可以簡單地使用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(); 
+0

請勿使用旨在表示片刻的類型來表示持續時間。一部電影的長度是一個半小時,而不是一個半小時。 – slim

+0

我同意這一點,並會推薦「持續時間」方法。我已經編輯來澄清這一點。 – assylias

2

不知道是否有什麼東西在建,但下面應該做的工作:

private long getSecondDuration(LocalDateTime t) { 
    long h = t.getHour(); 
    long m = t.getMinute(); 
    long s = t.getSecond(); 
    return (h * 3600) + (m * 60) + s; 
} 
3

沒有必要將其轉換爲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); 
2

我將開始與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()); 
} 
2

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隨着LocalTimeLocalDateTime等等 - 有方法的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]);