13

Datesとを使用すると奇妙な奇妙なことになりCalendarました。ポイントは、特定の日付を作成したいということです。

Calendar cal = Calendar.getInstance();
cal.set(1970, 0, 1, 0, 0, 0);
Date date = cal.getTime(); 

これで、正しい日付が表示されますが、デバッグ時に、日付変数の下に、たとえばの「fasttime」が表示されます-3599459。期待値がであるため、これによりJUnitテストが失敗します-3600000。カレンダーは初期化時に541ミリ秒などを追加するようです...

質問は次のとおりです。これなしで固定日付を単純に作成することはできません'私はバックグラウンドで数ミリ秒を追加しています'-ゴースト関数?

4

6 に答える 6

12

set呼び出しているメソッドのドキュメントから:

フィールドYEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE、およびSECONDの値を設定します。他のフィールドの以前の値は保持されます。これが望ましくない場合は、最初にclear()を呼び出します。

したがって、ミリ秒の値を保持しています。数ミリ秒は追加getInstanceされません。文書化されているように、を呼び出すとシステム時間がかかります。

最初に呼び出すclear()か、ミリ秒の値を明示的に設定します。(個人的には使用しますclear()。また、予定している時間を明確にするために、タイムゾーンも明示的に設定します。

または、 JodaTimeを使用して開始します。これははるかに快適な日付/時刻APIです。

于 2012-11-13T09:11:40.887 に答える
7

呼び出す前にこの行を追加してくださいcal.getTime()

cal.set(Calendar.MILLISECOND, 0);

これにより、ミリ秒をゼロに設定できます。

于 2012-11-13T09:11:01.703 に答える
0

一般的に使用されるベストプラクティスはClock、Date /TimeAPIへのすべてのアクセスをラップするオブジェクトを導入することです。

基本的に、2つの実装があります。1つはSystemTimeClock選択した日付/時刻プロバイダーにすべてを転送し、もう1つはテストに使用するモック実装です。

そうすることで、コードがAPIの詳細から独立し、テストがスムーズに実行されます。

于 2012-11-13T09:13:26.600 に答える
0

日付を扱うとき、私はライブラリJodaTimeにかなり満足しています。それがあなたの質問に対する正確な答えではないことは知っていますが、多分、調べる価値があります:http: //joda-time.sourceforge.net/ JavaDocs:http: //joda-time.sourceforge.net/apidocs/org/joda /time/DateTime.html

于 2012-11-13T09:16:19.583 に答える
0

問題は、「set」が「millisecond」値を設定しないため、ミリ秒値がgetInstanceを使用してカレンダーを作成したときの値のままであるということです。あなたは呼び出すことができます

cal.set(Calendar.MILLISECOND, 0);

getTimeを呼び出す前に、ミリ秒が0であることを確認します。グレゴリオ暦を直接作成することもできます。

Calendar cal = new GregorianCalendar(1970, 0, 1, 0, 0, 0);
assertEquals(0, cal.get(Calendar.MILLISECOND));

カレンダーおよび時間機能のより完全な実装が必要な場合は、標準のJavaCalendarAPIの代わりにJodaTimeを使用できます。

于 2012-11-13T09:17:14.343 に答える
-1
Calendar cal = Calendar.getInstance(); 
cal.setTime(new Date());
于 2014-11-17T12:07:47.923 に答える