我使用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();
} 有什么想法吗?
由于
答案 0 :(得分: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
。
答案 1 :(得分:0)
日历有点奇怪,因为你可以在它的javadoc中读到;最重要的是你必须在每次调用calendar.set(...)之后调用calendare.get(),否则修改可能会不一致。