7

私は次のことをしました:

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

今:

range.getTime();

.. 61,000 ではなく -3539000 の出力が得られます

何が間違っているのかわかりません。デバッグがcdate存在する場合、属性にはfraction、値 61,000 を含む が含まれます。これは私が望むものです。

4

6 に答える 6

3

これが表示される理由は、作成している日付が実際には日付エポックの過去であり、1m1 秒後ではありません。

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 の問題が直接の原因ではないかもしれませんが、ほぼ確実に関連しています。

于 2013-03-01T15:59:00.753 に答える
1

Java Dateは、特定の期間の期間を計算するようには設計されていません。getTime()呼び出しは、1970年1月1日00:00:00GMTからのミリ秒数を返します。あなたの場合、実際にはそのエポックより前の日付になります(したがって負の数)。コードを実行すると、21661000になります(Sean Landsmanが否定的な結果を得る理由を突き止めたと思うので、回答を参照してください...ヒント:私の番号はGMTからちょうど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
于 2013-03-01T17:32:09.807 に答える
0

JavaDocによると、getTime()

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

1分1秒のミリ秒数が必要です。

(60*minutes+seconds)*1000

Dateそれは本当にオブジェクトから来る必要はありません。

ある間隔で時間をミリ秒単位で計算する必要がある場合は、jodaタイムライブラリを使用するか、日付オブジェクトから日、時、分、秒、ミリ秒のコンポーネントを取得して、手動で値を計算します。

于 2013-03-01T16:06:19.327 に答える
0

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

必要なのは次のとおりです。

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

それを試してみてください!

于 2013-03-01T17:49:06.390 に答える
0

試す:

Date range1 = rangeFormatter.parse("00:01:01");
Date range2 = rangeFormatter.parse("00:00:00");
System.out.println(range1.getTime() - range2.getTime());
于 2013-03-01T16:07:54.613 に答える
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());
于 2013-03-01T16:01:09.847 に答える