通过java.util.Calendar.add()添加一周失败

通过java.util.Calendar.add()添加一周失败,java,date,calendar,dayofweek,Java,Date,Calendar,Dayofweek,我试图在两个日期(结束日期是今天)之间的所有周内迭代Java程序。首先,我得到开始日期: Calendar start = Calendar.getInstance(); start = data.getFirstDate(users, threads); 到目前为止,一切顺利。开始日期是正确的,我可以处理它。现在我重复: Calendar current = start; while(current.before(Calendar.getInstance()) { // Do som

我试图在两个日期(结束日期是今天)之间的所有周内迭代Java程序。首先,我得到开始日期:

Calendar start = Calendar.getInstance();
start = data.getFirstDate(users, threads);
到目前为止,一切顺利。开始日期是正确的,我可以处理它。现在我重复:

Calendar current = start;
while(current.before(Calendar.getInstance()) {
    // Do something
    current.add(Calendar.DATE, 7);
}
嗯,这种方法很有效。我从2002/8/23开始,然后是2002/8/30,然后是2002/9/7至2002/11/30。之后的日期是2003/0/6,这既不正确,也不是有效日期

我做错了什么?我尝试了
current.add(Calendar.DATE,7)
current.add(Calendar.WEEK\u OF u YEAR,1)
current.add(Calendar.DAY\u OF u YEAR,7)
和其他两种方法。使用
current.roll(Calendar.DATE,7)
不起作用,因为我呆在同一个月。使用
gregorianalendar
也没有效果

如有任何建议,将不胜感激

谢谢
Julian

日历API中的月份字段是基于0而不是基于1的。所以0代表一月。不要问我为什么。

如果你将0视为一个月,那就是一月,因为月份是以0指数为基础的。0是一月,11是十二月。

我认为你对日期的解释不正确。月份字段以零为基础,即一月为0。所以,2002年11月30日是12月30日

tl;博士 java.time 现代答案使用java.time类,而不是
日历

LocalDate
该类表示一个仅限日期的值,不包含一天中的时间和时区

时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,中午夜后几分钟是新的一天,而中仍然是“昨天”

如果未指定时区,JVM将隐式应用其当前默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好将所需/预期时区明确指定为参数

大陆/地区
的格式指定,例如,或
太平洋/奥克兰
。切勿使用3-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

确定你的出发日期。您可以通过数字指定月份,1月至12月的sane编号为1-12,这与传统类中基于零的疯狂编号不同

LocalDate start = LocalDate.of( 2017 , 2 , 23 ) ;  // Month is 1-12 for January-December.
或者,最好使用预定义的枚举对象,一年中每个月一个

LocalDate start = LocalDate.of( 2017 , Month.FEBRUARY , 23 ) ;
从这里开始,循环就是基本的Java,使用
LocalDate
对象的比较方法:
isBefore
isAfter
isEqual

LocalDate ld = start ;
while( ld.isBefore( today ) ) {
    ld = ld.plusWeeks( 1 ) ;
    …
}

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android,该项目采用了ThreeTen Backport(如上所述)。看

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。

@Joeri:谢谢。我误读了这个问题,写了一个错误的答案,还没来得及编辑,我就被否决了。以后要更加小心;-)仅供参考,诸如和
java.text.simpleDataFormat
之类的旧日期时间类现在已被内置于Java8和Java9中的类所取代。看见
LocalDate start = LocalDate.of( 2017 , Month.FEBRUARY , 23 ) ;
LocalDate ld = start ;
while( ld.isBefore( today ) ) {
    ld = ld.plusWeeks( 1 ) ;
    …
}