簡體   English   中英

java.util.Date得到毫秒

[英]java.util.Date get milliseconds

我做了以下事情:

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

現在:

range.getTime();

..我的輸出為-3539000而不是61,000

我不確定我做錯了什么; 在調試時, cdate存在,該屬性包含一個fraction ,其中包含值61,000,這就是我想要的。

你看到這個的原因是你創建的日期實際上是在日期時代的過去,而不是它之后的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,但由於BST / GMT更改日期和時區的歷史錯誤無法跟蹤。 似乎Sun / Oracle認為這是一個歷史性的“不准確”。

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

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

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

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

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

為了得到你想要的東西,你應該比較你想要的時間和時間的來源。 使用以下代碼:

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());

根據JavaDoc, getTime()

返回自此Date對象表示的1970年1月1日00:00:00 GMT以來的毫秒數。

您想要一分鍾和一秒鍾內的毫秒數。

(60*minutes+seconds)*1000

它實際上不需要來自Date對象。

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

嘗試:

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

hh:mm:ss代表12小時的時間,它總是代表“時間點”,而不是“時間間隔”。 所以,時區肯定會影響價值。 但是,在GMT +0中,該值等於表示“時間間隔”。

你只需要:

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

試試吧!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM