2013-06-05 22 views
1

爲什麼下面的Java代碼的輸出是04:18:23而不是03:18:23?Java中的時差

public static void main(String[] args) { 
    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); 
    try { 
     Date start = sdf.parse("00:44:16"); 
     Date end = sdf.parse("04:02:39"); 
     long duration = end.getTime() - start.getTime(); 
     Calendar cal = Calendar.getInstance(); 
     cal.setTimeInMillis(duration); 
     System.out.println(sdf.format(cal.getTime())); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
} 
+3

什麼是您的時區? – JoshDM

+1

爲我打印22:18:23。 – djechlin

+0

http://stackoverflow.com/questions/1555262/calculating-the-difference-between-two-java-date-instances – NullUserException

回答

10

因爲這不是你如何獲得持續時間。你的代碼改成這樣:

package com.sandbox; 

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 

public class Sandbox { 

    public static void main(String[] args) { 
     SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); 
     try { 
      Date start = sdf.parse("00:44:16"); 
      Date end = sdf.parse("04:02:39"); 
      long duration = end.getTime() - start.getTime(); 
      Calendar cal = Calendar.getInstance(); 
      cal.setTimeInMillis(duration); 
      System.out.println(new SimpleDateFormat("yyyy MM dd HH:mm:ss").format(cal.getTime())); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

你會看到它打印出1969 12 31 19:18:23。這是一個日期不是持續時間。由於您打印出答案時跳過日期組件,因此出現,因爲它會打印出一段時間,但事實並非如此。

坦率地說,我不知道如何在java中做到這一點。我只使用JodaTime庫。有一個名爲Duration的課程使得這一點變得簡單。下面是一個如何使用它來打印出結果的SO問題:"pretty print" duration in java

+0

我複製粘貼你的代碼,我得到以下輸出:1970 01 01 04:18:23 – Vlad

+1

@Vlad可能是因爲我們的時區有所不同。我們得到的差異與我的觀點無關:你打印出日期,而不是持續時間。 –

+0

@tieTYT如果將時區設置爲UTC,則會打印預期結果。這是一個巨大的黑客攻擊,但如果差異小於24小時,它將起作用。 – NullUserException

3

或者,如果您不想使用JodaTime,計算小時,分鐘和秒的計算非常簡單以毫秒爲單位:

public static void main(String[] args) throws ParseException { 
    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); 
    Date start = sdf.parse("00:44:16"); 
    Date end = sdf.parse("04:02:39"); 
    long durationMs = end.getTime() - start.getTime(); 

    final int oneHourMs = 3600000; 
    final int oneMinuteMs = 60000; 
    final int oneSecondMs = 1000; 

    long hours = durationMs/oneHourMs; 
    long minutes = (durationMs % oneHourMs)/oneMinuteMs; 
    long seconds = (durationMs % oneMinuteMs)/oneSecondMs; 

    System.out.format("%02d:%02d:%02d", hours, minutes, seconds); 
    // outputs: 03:18:23 
} 
0

問題:

  • 你臨時抱佛腳時間的日值劃分爲日期時間對象。
  • 您正在使用衆所周知的麻煩的舊日期時間類,現在是遺留的,由java.time類取代。

LocalTime類表示沒有日期且沒有時區的時間值。

LocalTime start = LocalTime.parse("00:44:16"); 
LocalTime stop = LocalTime.parse("04:02:39"); 

Duration表示未連接到時間線的時間跨度。

Duration duration = Duration.between (start , stop);