2013-03-01 8 views
6

私は次のことを行っている:今java.util.Date GETミリ秒

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

range.getTime(); 

..私は、私は「-3539000なく61,000

の出力を得ます私は何が間違っているのか分からない。デバッグ時にcdateが存在する場合、その属性にはfractionが含まれています。この値には61000という値が含まれています。あなたがこれを見ている

+0

このウェブサイトは英語のみですが、恐れ入ります。必要に応じて、それをもっと明確にするための周りの人が常にいます – HXCaine

+0

Diese ist Englisch Website、kein Deutsch – PermGenError

+0

英語で書くことができますか? –

答えて

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

その出力。それは00:00:00である必要がありますが、BST/GMTは追跡を傾ける日付とタイムゾーンを変更する原因にhistorical bug -

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

エポック日はここで間違っています。 Sun/Oracleはこれを歴史的な「不正確」と考えているようです。

バグレポートを確認してください。バグレポートで詳しく説明しています。

あなたの言語(ドイツ語)から、これはこのBSTの問題が原因ではないかもしれませんが、ほぼ確実に関連しています。

+0

彼が望むのは時差です。彼がやっていることは、日付を計算することです。問題は実際にはバグではありません –

+0

@AdelBoutros私は彼が彼が見ていた振る舞いの理由であって、それを行う方法ではないと思っていました。ここの答えから彼は –

0

あなたが望むものを得るためには、あなたが望む時間と時間の起源を比較する必要があります。 JavaDocの、getTime()による

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

を選ぶことができますか? 1時間1分1秒のミリ秒数は61000ではありません。 – RudolphEst

+0

@ルドルフエスト私の編集を確認してください –

+0

私はそれが好きです! OPが時間差を計算しているように見えるので、それは絶対に正しい方法です(時間を自分で計算したくない場合)。 – RudolphEst

0

:以下のコードを使用して

は1970年1月1日、このDateオブジェクトによって表さ00:00:00 GMTからのミリ秒数を返します。

ミリ秒を1分1秒で入力します。

(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で、私は彼が負の結果を得た理由にヒットしたと信じています...ヒント:マイナンバーはGMTまたは21600000msのちょうど6時間です)

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

FYI、Joda-Timeは期間、時間、期間の3つのクラスを提供します。 –

0

hh:mm:ssは、「時間間隔」ではなく「時間点」を常に表す12時間の時間を表します。だから確かに、タイムゾーンは値に影響します。ただし、GMT +0では、値は「時間間隔」を表します。

あなただけ必要なのは次のとおりです。

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

それをお試しください!