ロジックの一部として、私のプログラムでは、長い Java タイムスタンプ (年、月などを含む) を「短い」Java 時間に変換する必要があります。これは、元の時間とまったく同じ時間、分、秒に対応する必要がありますが、1970 年 1 月 1 日から 1 日以内です (つまり、0 (00:00:00) から 86400000 (23:59:59) までの値)。例は、質問の変換です。
これを実行するには、以下のコードが機能すると考えました。
public int convertToTime(long fullTimeStamp) {
Calendar c = Calendar.getInstance();
c.setTimeInMillis(date);
c.set(Calendar.DATE, 1);
c.set(Calendar.MONTH, 0);
c.set(Calendar.YEAR, 1970);
return (int) c.getTimeInMillis();
}
私が抱えている問題は、タイムゾーンに関係しています。英国では、現在 BST にいます。関数ですべての値を設定した後、時間は同じ数字 (たとえば午前 8 時) のままですが、タイムゾーンが GMT に変更されます! もちろん、GMT の午前 8 時は、BST の午前 8 時と同じではなく、BST の午前 9 時と同じです。
関数にコンソール出力を追加すると、この問題が示されます。
public int convertToTime(long fullTimeStamp) {
System.out.println(new Date(fullTimeStamp)); // correct
Calendar c = Calendar.getInstance();
c.setTimeInMillis(fullTimeStamp);
System.out.println(c.getTime()); // correct
c.set(Calendar.DATE, 1);
c.set(Calendar.MONTH, 0);
c.set(Calendar.YEAR, 1970);
System.out.println(c.getTime()); // incorrect!
return (int) c.getTimeInMillis();
}
プログラム出力:
Wed Jun 19 12:15:00 BST 2013 // ok
Wed Jun 19 12:15:00 BST 2013 // this makes sense
Thu Jan 01 12:15:00 GMT 1970 // Calendar, stahp!
望ましい動作は、最後の部分を読み取ることです。
Thu Jan 01 11:15:00 GMT 1970
or
Thu Jan 01 12:15:00 BST 1970
これはカレンダーの予想される動作ですか? 私の理解では、変更されていないすべての「数字」が同じままであるため、HOUR_OF_DAY の値が 8 の場合、タイムゾーンが変更されても 8 のままにする必要があります。
カレンダーのタイムゾーンを (値が設定される前に) BST と GMT に設定しようとしましたが、まったく同じ動作が発生します。また、うるう年を処理する必要があるため、1970 年以降のすべての年を削除するためにミリ秒を手動で追加または削除することもできません。
「Joda 時間 (または他の時間パッケージ) を使用する」以外に、この操作を実行するための他の提案はありますか? 可能であれば、他のパッケージを試す前に、簡単に修正する必要があります。
ありがとう!