2

アプリケーションでは一定の期間を使用します。ユーザーが新しい期間を追加すると、デフォルトで午前 6:00 から翌日の午前 6:00 になるはずです。

通常は 24 時間ですが、1 つ問題があります。夏時間の変更が行われると、その期間の長さが変わります。例えば ​​:

10 月 27 日午前 6:00 ~ 10 月 28 日午前 6:00。この期間に、CEST から CET タイム ゾーンへの変更シフトが実行されます。したがって、この期間には 25 時間が含まれます。

From 27 October 6:00 AM to 28 October 3:00 AM - there are 21 hours
at 3:00 am the time is shifted back by 1 hour, so there are 4 hours until 28 October 6:00 AM.

この問題が発生したため、ユニット テストを記述して、再度表示されないようにしました。テストは私たちのマシンでは成功しましたが、CI サーバーでは失敗しました (別のタイム ゾーンにあります)。

問題は、マシンのタイム ゾーンとは無関係に単体テストをどのように設計できるかということです。

現在、時間スパンの計算はJoda-Timeを使用して計算されます。

    if ((aStartDate == null) || (aEndDate == null)) {
        return 0;
    }
    final DateTime startDate = new DateTime(aStartDate);
    final DateTime endDate = new DateTime(aEndDate);
    return Hours.hoursBetween(startDate, endDate).getHours();

私たちの側では成功するが、CI サーバーでは失敗する単体テスト:

    Calendar calendar = Calendar.getInstance();
    calendar.set(2012, Calendar.OCTOBER, 27, 6, 0);
    startDate= calendar.getTime();
    calendar.set(2012, Calendar.OCTOBER, 28, 6, 0);
    endDate= calendar.getTime();

カレンダーにタイムゾーンを使用しようとしました:

    TimeZone.setDefault(TimeZone.getTimeZone(TimeZone.getTimeZone("GMT").getID()));
    Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone(TimeZone.getTimeZone("GMT").getID()));
    calendar.set(2012, Calendar.OCTOBER, 27, 6, 0, 0);
    startDate= calendar.getTime();
    calendar.set(2012, Calendar.OCTOBER, 28, 6, 0, 0);
    endDate= calendar.getTime();

ただし、この場合、結果の startDate は 10 月 27 日 9:00 CEST で endDate は 10 月 28 日 8:00 CET であるため、テストはこちら側でも失敗します。

前もって感謝します。

4

3 に答える 3

6

私があなたの質問を理解したように、あなたは標準のサーバーのタイムゾーンを使用する代わりに、夏時間の切り替え中に正しい時間をテストするためにサーバーにタイムゾーンを設定したいと思います。これを実現するには、タイムゾーンで夏時間のオフセットを使用できる必要があります。

例でサーバーで使用したタイムゾーン

TimeZone zone = TimeZone.getTimeZone("GMT");

夏時間を使用しません:をzone.useDaylightTime()返しますfalse

代わりに特定のタイムゾーンを使用してみてください。

TimeZone zone = TimeZone.getTimeZone("Europe/Chisinau");

夏時間のオフセットがあります。

Joda TimeのDateTimeクラスでタイムゾーンを使用して、JavaのCalendarクラスとDateクラスの使用を回避することもできます。

于 2012-10-26T20:52:16.997 に答える
-2

通常の java.util.Calendar を使用しないのはなぜですか?

    final Calendar startTime = new GregorianCalendar( 2012, Calendar.OCTOBER, 27, 2, 12, 0 );
    startTime.setTimeZone( TimeZone.getTimeZone( strTimeZone ) );
    System.out.println( startTime.getTimeInMillis() );
于 2012-10-26T05:59:55.223 に答える