2013-03-01 81 views
6

我也做了以下內容:java.util.Date中取毫秒

String standardRange = "00:01:01"; 
SimpleDateFormat rangeFormatter = new SimpleDateFormat("hh:mm:ss"); 
Date range = rangeFormatter.parse(standardRange); 

現在:

range.getTime(); 

..我得到的-3539000輸出,而不是61000

我我不知道我做錯了什麼;當調試時,cdate存在,該屬性包含fraction,其中包含值61,000,這是我想要的。

+0

本網站僅爲英文版,恐怕。請儘量把它寫成英文,如果有必要,總會有人幫助使它更清楚 – HXCaine 2013-03-01 15:45:59

+0

Diese ist Englisch網站,kein Deutsch – PermGenError 2013-03-01 15:46:01

+0

你能用英語寫作嗎? – 2013-03-01 15:46:01

回答

3

你看到這種情況的原因是,你正在創建的日期實際上是在日期時代的過去,而不是後1m1s:

String standartRange = "00:01:01"; 
SimpleDateFormat rangeFormatter = new SimpleDateFormat("hh:mm:ss"); 
Date range = rangeFormatter.parse(standartRange); 

System.out.println(new Date(0L)); 
System.out.println(new Date(0L).getTime()); 
System.out.println(range); 
System.out.println(range.getTime()); 

,其輸出;

Thu Jan 01 01:00:00 GMT 1970 
0 
Thu Jan 01 00:01:01 GMT 1970 
-3539000 

的劃時代日期不正確位置 - 它應該是00:00:00,但是由於historical bug,其中BST/GMT改變日期和時區不能跟蹤。 Sun/Oracle似乎認爲這是歷史上的「不準確」。

查看錯誤報告 - 它更全面地描述了這個問題。

從您的語言(德語),這可能不是直接由於這個BST問題,但它幾乎肯定相關。

+0

他想要的是時差。他在做什麼是計算日期。問題其實不是一個錯誤 – 2013-03-01 16:32:35

+0

@AdelBoutros我不同意 - 我認爲他是在看到他所看到的行爲的原因,而不是如何去做。從這裏的答案他可以選擇 – 2013-03-01 16:35:15

0

爲了得到你想要的,你應該比較你想要的時間和時間的起源。使用下面的代碼:

String standardRange = "00:01:01"; 
SimpleDateFormat rangeFormatter = new SimpleDateFormat("HH:mm:ss"); 
Date range = rangeFormatter.parse(standardRange); 
Date range2 = rangeFormatter.parse("00:00:00"); 
System.out.println(range.getTime() - range2.getTime()); 
+0

咦?一小時一分鐘一秒的毫秒數不是61000 ... – RudolphEst 2013-03-01 16:07:09

+0

@RudolphEst檢查我的編輯 – 2013-03-01 16:31:12

+0

我喜歡那樣!看起來OP正在計算時間差,所以這絕對是最正確的方法(如果你不想自己計算時間)。 – RudolphEst 2013-03-01 16:36:03

0

據的JavaDoc,getTime()

返回自1970年1月1日,由該日期對象表示00:00:00 GMT的毫秒數。

你希望在一分鐘和一秒鐘內的毫秒數。

(60*minutes+seconds)*1000 

它確實不需要來自Date對象。

如果您需要計算某個時間間隔的時間(以毫秒爲單位),可以使用joda time庫,或者從日期對象中獲取日,小時,分鐘,秒和毫秒分量並手動計算該值。

0

嘗試:

Date range1 = rangeFormatter.parse("00:01:01"); 
Date range2 = rangeFormatter.parse("00:00:00"); 
System.out.println(range1.getTime() - range2.getTime()); 
1

Java的日期不是用來計算給定時間內的持續時間。 getTime()調用返回自1970年1月1日00:00:00 GMT以來的毫秒數。在你的情況下,你實際上結束了一個在該時代之前的日期(因此是負數)。當我運行你的代碼時,我得到了21661000.(請參見Sean Landsman的答案,因爲我相信他已經打了你爲什麼會得到負面結果......提示:我的號碼格林威治標準時間正好6小時或21600000ms)

Joda-Time是一個非常適合解決您的潛在問題的庫。

PeriodFormatter formatter = new PeriodFormatterBuilder() 
     .appendHours() 
     .appendSeparator(":") 
     .appendMinutes() 
     .appendSeparator(":") 
     .appendSeconds() 
     .toFormatter(); 
Period period = formatter.parsePeriod("00:01:01"); 
assert period.toStandardDuration().getMillis() == 61000 
+0

僅供參考,Joda-Time提供了三個類來表示一段時間:持續時間,時間間隔和時間段。 – 2014-06-01 07:06:16

0

hh:mm:ss代表12小時的時間,這始終代表「時間點」,而不是「時間間隔」。所以當然,時區會影響價值。但是,在GMT +0中,該值等於表示「時間間隔」的值。

所有你只需要爲:

rangeFormatter.setTimeZone(TimeZone.getTimeZone("GMT")); 

試試吧!