【发布时间】:2012-10-23 19:20:28
【问题描述】:
我已经搜索过这个问题的答案,但似乎找不到。有人能解释一下为什么下面的代码没有给我每个月的 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 的工作原理缺乏了解。无论哪种情况,我只想要下个月(同一天),除非某些月份和日期当然有问题。但是上面的场景让我很困惑。一个月中的任何其他日子都不会发生这种情况,只会发生在第一天。
【问题讨论】:
-
在 joda 时间更改库的日期和时间,在这个库中你找不到任何错误
-
不幸的是,我必须使用日历 API,所以切换不是这个项目的选项。
-
Calendar可以说是 JDK 中最糟糕的类:它几乎无法使用。在内部,它看起来像是由(糟糕的)初级程序员编写的。使用乔达时间。就是这么简单。你应该告诉谁让你使用Calendar,他们应该尝试在与编程无关的领域工作。