我已经搜索过这个问题的答案,但似乎找不到。有人可以解释为什么下面的代码不给我每个月的 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 的。如果我改用 Calendar.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 日。
最佳答案
这是一个时区问题。用以下内容替换您现有的设置行,以便日历和格式化程序都使用相同的时区:
TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
formatter.setTimeZone(tz);
Calendar cal = Calendar.getInstance(tz);
一切正常:
Current calendar time=Fri Jun 01 08:00:00 BST 2012
In loop - current calendar time=Sun Jul 01 08:00:00 BST 2012
In loop - current calendar time=Wed Aug 01 08:00:00 BST 2012
In loop - current calendar time=Sat Sep 01 08:00:00 BST 2012
In loop - current calendar time=Mon Oct 01 08:00:00 BST 2012
In loop - current calendar time=Thu Nov 01 07:00:00 GMT 2012
您可能希望将 toString()
调用替换为 formatter.format()
调用,以便输出也处于正确的时区(它可能看起来不错如果你在美国东部时间,但我在英国时区,如你所见)。
关于Java 日历不一致的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13037636/