1

我对使用 GregorianCalendar 方法的抽象 Calendar 类有一个奇怪的问题。

出于某种原因,使用“calendar.set”会返回前一天的日期。例如,请参阅下面的代码,其中包含关于它在哪里正常工作以及哪里出错的注释。

private Date checkDate(Date d, int hour, int minute, int sec, int milliSec)
{
    // Test values for arguments
    d = "Wed Apr 06 00:00:00 BST 2011";
    hour = minute = sec = milliSec = 0;

    Calendar calendar = new GregorianCalendar(sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]);
    calendar.setTime(d);

    // *** OK *** calendar.getTime() will display correctly here (Wed Apr 06 00:00:00 BST 2011)

    calendar.set(Calendar.HOUR_OF_DAY, hour);
    calendar.set(Calendar.MINUTE, minute);
    calendar.set(Calendar.SECOND, sec);
    calendar.set(Calendar.MILLISECOND, milliSec);

    // *** NOT OK *** calendar.getTime() will display inncorrectly here (Tue Apr 05 01:00:00 BST 2011)


return calendar.getTime();  

} 有任何想法吗?

谢谢

4

2 回答 2

5
Calendar calendar = new GregorianCalendar(sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]);
calendar.setTime(d);

好的,所以您有一个时区设置为 UTC 的日历并将其时间设置为

Wed Apr 06 00:00:00 BST 2011.

在内部,这被映射到

2011-04-05 23:00:00 UTC(采用日期和时间,保留时区)。

将日历的小时、分钟、秒和毫秒字段设置为 0 会将其更改为

2011-04-05 00:00:00 UTC.

如果您现在将日历转换为java.util.Date对象并在考虑本地时区 (BST) 的同时打印它,输出将是:

2011-04-05 01:00:00 BST.

于 2011-04-06T14:45:14.447 回答
0

日历有点奇怪,你可以在它的 javadoc 中阅读;底线是每次调用 calendar.set(...) 后都必须调用 calendare.get() ,否则修改可能会不一致。

于 2011-04-06T14:04:37.763 回答