通过java.util.Calendar.add()添加一周失败
我试图在两个日期(结束日期是今天)之间的所有周内迭代Java程序。首先,我得到开始日期:通过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
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 ) ;
…
}