2

ジョブがランタイム内にあるかどうかを判断する次のコード スニペットがあります。

private boolean isDuringRuntime(Job job) {

    Date now = new Date();

    System.out.println(DateUtil.getToday());
    System.out.println(job.getStartTime().toString());
    System.out.println(job.getEndTime().toString());

    Date startTime = new Date(job.getStartTime().getTime() 
                                      + DateUtil.getToday().getTime());

    Date endTime = new Date(job.getEndTime().getTime() 
                                      + DateUtil.getToday().getTime());


    System.out.println("Start Time: " + startTime.toString());
    System.out.println("Stop Time: " + endTime.toString());

    return now.after(startTime) && now.before(endTime);
}

DateUtil.getToday()

public static Date getToday() {
    Date now = new Date();
    Calendar cal = Calendar.getInstance();
    cal.setTime(now);

    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);

    return cal.getTime();
}

1回の実行の出力は次のとおりです。

Sun Jul 14 00:00:00 EDT 2013 //This is DateUtil.getToday();
1970-01-01 13:15:00.0  //Raw Start Time
1970-01-01 18:15:00.0  //Raw End Time
Start Time: Sun Jul 14 18:15:00 EDT 2013  //Computed Start Time 
Stop Time: Sun Jul 14 23:15:00 EDT 2013   //Computed End Time

計算された開始時刻と計算された終了時刻が 5 時間進んでいる理由がわかりません。開始時刻はSun Jul 14 13:15:00 EDT 2013、終了時刻は になると思いますSun Jul 14 18:15:00 EDT 2013

誰かが私が間違っているところを指摘できますか? 私はよく知らないのでDate、単純なものを見落としているのではないかと思います。

4

2 に答える 2

1

日付は、ロケールで現在報告可能な時間を反映する、完全にローカライズされた日時をラップしないことを理解してください。

Date は、1970 年 1 月 1 日 UTC から経過したミリ秒数である長整数の (変更可能な) ラッパーです。long は UTC を反映していることに注意してください (システムが理解できる限りではありますが、最近のほとんどすべてのシステムは、ある種のネットワーク タイム サービスを使用して同期されています)、タイム ゾーンではありません。

日付をローカライズされた日時文字列にマッピングする場合、使用しているカレンダーが、UTC から EST などにマッピングする必要があることを認識していることを確認する必要があります (該当する場合は DST のプラスまたはマイナス)。あなたが説明している問題は、タイム ゾーン マッピングの問題のように聞こえます。作成した Calendar インスタンスは TimeZone で初期化されていません。

于 2013-07-14T19:12:17.547 に答える