0

長い値をフォーマットされた時間に変換したいと思っていました。私が使用したコード:

long startTimeInSeconds = 60*60*1000*sH + 60*1000*sM + sS*1000 + sL;
SimpleDateFormat dateFormat = new SimpleDateFormat("hh:mm:ss,SSS");
Date start= new Date(SU.startTime);
StartTime = dateFormat.format(start);

ここsH sMに .. 時間分 .. 文字列から、形式は次のとおり"hh:mm:ss,SSS"です。
SU.startTimeですstartTimeInSeconds
StartTime文字列です。

を表示すると、正しい時刻が表示さStartTimeれません。
たとえば、startTimeInSecondsがの場合2510823、そうでなければなりません0:41:50,823が、 が得られ1:41:50,823ます。
時間分を表示すると、何が間違っていたのかわかりません...次のように:

int hours = (int) (SU.startTime / (60 * 60 * 1000));

次に、正しい値を取得します。

この問題の解決策を知っている人はいますか??

4

4 に答える 4

6

私の推測では、1970 年 1 月 1 日のタイム ゾーンが GMT+1 であった英国またはフランスにいると思います。タイムゾーンを「GMT」に設定すると、この問題は発生しません。

于 2013-01-25T10:41:28.360 に答える
5

他の人が示唆しているように、当面の問題はタイムゾーンを指定することで修正されます。ただし、より微妙な問題は、不適切な型を使用していることです。持続時間は、その音によって、または場合によっては 1 日の時間だけです。それは不明です。適切なタイプを使用できる場合は、ここでタイム ゾーンを使用しないでください。結局のところ、「開始時間 (秒単位)」には、それに関連するタイム ゾーンが論理的にありません。

残念ながら、Java にはこれをカバーする適切な型が実際にはありません。Dateと がありますがCalendar、どちらも適切ではありません。代わりにJoda Timeを使用することをお勧めします。ここでは、要件に基づいてDurationまたはタイプを使用できます。その後、そのタイプに適切なフォーマッタを使用すると、この問題に遭遇することはありません。LocalTime

Joda Time は、一般的に日付/時刻を処理するためのはるかに優れた API です。可能な限り、Java API よりも Joda Time を使用することを強くお勧めします。

編集: コメントに記載されているように、真夜中を 12 ではなく 00 として表示するために 24 時間時計が必要なため、フォーマット文字列ではHHなく必要です。hh

于 2013-01-25T10:45:13.533 に答える
1

使用する TimeZone の場合かもしれません。DateFormat を指定しない場合、デフォルトが DateFormat に提供されます。

于 2013-01-25T10:40:50.687 に答える
0

日付の代わりにカレンダーを使い始めたほうがいいです。それについて少し研究する必要があります。

于 2013-01-25T12:16:41.493 に答える