2015-05-24 112 views
0

我只是做兩個不同的日曆兩個timemilisseconds簡單的區別。日曆之間的java差異

實施例:

Calendar ini = Calendar.getInstance(); 
    try { 
     Thread.sleep(1500); 
    } catch (InterruptedException e) {e.printStackTrace();} 

    Calendar end = Calendar.getInstance(); 
    long diff = end.getTimeInMillis()-ini.getTimeInMillis(); 
    System.out.println("diff "+diff); 
    System.out.println("ini date "+ ini.getTime()); 
    System.out.println("end date "+ end.getTime()); 
    System.out.println("diff time format "+timeFormat.format(diff)); 

時間的格式爲:

private final static String TIME_STRING_FORMAT = "hh:mm:ss.SSS"; 
private static SimpleDateFormat timeFormat = new SimpleDateFormat(TIME_STRING_FORMAT); 

,並在輸出,總是出現1我們的差異,是它的的SimpleDateFormat的問題???

輸出:

diff 1500 
ini date Sun May 24 22:27:01 CEST 2015 
end date Sun May 24 22:27:03 CEST 2015 
diff time format 01:00:01.500 

感謝您的幫助!

+3

我不知道任何'SimpleDateFormat#format'重載接收'long'解析。請提供確切的代碼來複制您的問題。 –

回答

2

看起來像SimpleDateFormat使用時區。見this related question。所以當你給它一個1500毫秒的時間時,它認爲你給它是從格林威治標準時間開始時代開始的時間。然後將其轉換爲您的時區,給您一些小時的抵消。您可能希望將timeFormat的時區設置爲GMT。試試這個:

Calendar ini = Calendar.getInstance(); 
    try { 
     Thread.sleep(1500); 
    } catch (InterruptedException e) {e.printStackTrace();} 

    Calendar end = Calendar.getInstance(); 
    long diff = end.getTimeInMillis()-ini.getTimeInMillis(); 
    System.out.println("diff "+diff); 
    System.out.println("ini date "+ ini.getTime()); 
    System.out.println("end date "+ end.getTime()); 
    Date date = new Date(diff); 
    System.out.println(date); 
    timeFormat.setTimeZone(TimeZone.getTimeZone("GMT")); 
    System.out.println("diff time format "+timeFormat.format(date)); 
+0

更改SimpleDateFormat工作中的時區。 +1用於解釋錯誤來自何處。 – goncalotomas

2

1小時的差異是由您當地的時區造成的。 1970年1月1日格林尼治標準時間後,建立日期爲毫秒數。在歐洲大陸(在冬季),因此在1月1日01:00:01.500之後1500毫秒。

如果您使用Java 8,請參閱Period and Duration上的教程。 Duration可能是你想要使用的。

+1

是的。避免使用java.util.Date/.Calendar和SimpleDateFormat。使用內置於Java 8及更高版本的java.time包,或者使用Joda-Time。 –

+0

聽起來不錯,但我不能在Android中使用它:)任何想法?謝謝! – jurmeneta