3

タイムゾーン情報なしで年月日情報を保存する必要があります。
ここにいくつかのコードがあります:

private static void test() {
    Calendar cal = Calendar.getInstance();
    cal.setTimeZone(TimeZone.getTimeZone("US/Pacific"));
    System.out.println("Before: " + cal.get(DAY_OF_MONTH));
    //
    long datestamp = toDatestamp(cal.getTimeInMillis());
    long timestamp = toTimestamp(datestamp);
    cal.setTimeInMillis(timestamp);
    System.out.println("After: " + cal.get(DAY_OF_MONTH));
}

private static long toTimestamp(long datestamp) {
    return TimeUnit.DAYS.toMillis(datestamp);
    // return datestamp * DS_MULT;
}

private static long toDatestamp(long timestamp) {
    return TimeUnit.MILLISECONDS.toDays(timestamp);
    // return timestamp / DS_MULT;
}

// hours * minutes * seconds * milliseconds
private static long DS_MULT = 24 * 60 * 60 * 1000;

2つのアプローチがあり、そのうちの1つはコメントアウトされています。しかし、結果は同じです:

Before: 26
After: 25

変換後に日付が変わるのはなぜですか?明らかな何かが欠けていますか?

4

1 に答える 1

4

日に変換してミリ秒に戻すことで、カレンダーをその日の深夜に効果的に再設定できます。ただし、時間をミリ秒単位で設定すると、UTC時間(ほぼGMTと同等)として解釈されるため、カレンダーをUTCの午前0時にリセットします。タイムゾーン「US/Pacific」はUTCから負のオフセットがあるため、前日として表示されます。

これは、テストの最後に別の行を追加することで確認できます。

cal.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println("UTC: " + cal.get(DAY_OF_MONTH));

そして、あなたは見るべきです:

UTC: 26
于 2012-06-26T21:24:47.487 に答える