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;

有两种方法,其中一种被注释掉了。但结果是一样的:

Before: 26
After: 25

为什么转换后日期会改变?我错过了一些明显的东西吗?

4

1 回答 1

4

通过转换为天并返回毫秒,您可以有效地将日历重新设置为当天的午夜。但是,当您以毫秒为单位设置时间时,它被解释为 UTC 时间(大致相当于 GMT),因此您将日历重置为午夜UTC。因为时区“美国/太平洋”与 UTC 有负偏移,所以它显示为前一天。

您可以通过在测试结束时添加另一行来看到这一点:

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

你应该看到:

UTC: 26
于 2012-06-26T21:24:47.487 回答