日期Java日历结果不一致
我一直在寻找答案,但似乎找不到答案。有人能解释一下为什么下面的代码没有给出每个月的1,而是在几个月内跳到31吗?它适用于需要确定下个月日期的报告事件
DateFormat formatter = new SimpleDateFormat("dd-MMM-yy");
Calendar cal = Calendar.getInstance( TimeZone
.getTimeZone( "America/Los_Angeles" ) );
DateFormat formatter = new SimpleDateFormat("dd-MMM-yy");
Date date;
try
{
date = (Date)formatter.parse("01-JUN-12");
cal.setTime(date);
//cal.set(2012, 05, 01);
long now = new Date().getTime();
int frequency = 1;
System.out.println("Current calendar time=" + cal.getTime().toString()) ;
while (cal.getTime().getTime() < now)
{
cal.add( Calendar.MONTH, frequency );
System.out.println("In loop - current calendar time=" + cal.getTime().toString()) ;
}
}
catch (ParseException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
输出为:
Current calendar time=Fri Jun 01 00:00:00 EDT 2012
In loop - current calendar time=Sun Jul 01 00:00:00 EDT 2012
In loop - current calendar time=Tue Jul 31 00:00:00 EDT 2012
In loop - current calendar time=Fri Aug 31 00:00:00 EDT 2012
In loop - current calendar time=Mon Oct 01 00:00:00 EDT 2012
In loop - current calendar time=Wed Oct 31 00:00:00 EDT 2012
注意它是如何跳到31,然后又回到1的。如果我用日历。set()相反,输出是正确的:
Current calendar time=Fri Jun 01 15:14:26 EDT 2012
In loop - current calendar time=Sun Jul 01 15:14:26 EDT 2012
In loop - current calendar time=Wed Aug 01 15:14:26 EDT 2012
In loop - current calendar time=Sat Sep 01 15:14:26 EDT 2012
In loop - current calendar time=Mon Oct 01 15:14:26 EDT 2012
In loop - current calendar time=Thu Nov 01 15:14:26 EDT 2012
这似乎是1)日历API的缺陷,或2)对日历API的工作方式缺乏了解。无论哪种情况,我只想要下个月(同一天),当然,除非某些月份和日期有问题。但上述情景让我感到困惑。这个月的其他任何一天都不会发生这种情况,只有第一天
# 1 楼答案
这是一个时区问题。用以下内容替换现有的设置行,以便日历和格式化程序都使用相同的时区:
一切都很好:
你可能想用
formatter.format()
调用替换toString()
调用,这样输出也在正确的时区(如果你在EDT,你可能觉得没问题,但你可以看到,我在英国时区)