使用 java.time
Joda-Time 项目现在位于maintenance mode,团队建议迁移到java.time 类。见Tutorial by Oracle。
LocalDate 类表示没有时间和时区的仅日期值。
LocalDate start = LocalDate.of( 2017 , Month.JANUARY , 23 ) ;
LocalDate stop = LocalDate.of( 2017 , Month.FEBRUARY , 2 ) ;
顺便说一句,您可能需要添加一个健全性检查来验证结尾不在开头之前。
不是之后
我相信您正在寻找的逻辑(包括结束日期)是“不在之后”。 LocalDate 类包含一个 isAfter 方法,您可以在其中添加一个逻辑“NOT”(!)。
此外,在这种情况下,while 循环似乎比for 循环更合适且不言自明。
LocalDate ld = start ;
List<LocalDate> dates = new ArrayList<>() ;
while ( ! ld.isAfter( stop ) ) {
dates.add( ld ); // Collect this date.
ld = ld.plusDays( 1 ) ; // Setup the next loop.
}
看到这个code run live at IdeOne.com。
日期:[2017-01-23、2017-01-24、2017-01-25、2017-01-26、2017-01-27、2017-01-28、2017-01-29、2017- 01-30, 2017-01-31, 2017-02-01, 2017-02-02]
半开
当 currentDate 到达 endDate 的前一天时,迭代停止
这实际上是可取的。被称为半开,日期时间处理的常用方法是将开头视为包含,而结尾是排除。因此,午休时间从 12:00:00(中午)开始,一直持续到(但不包括)13:00:00(下午 1 点)。一月份从 1 月 1 日开始,一直到但不包括 2 月 1 日。一周从星期一开始,一直到但不包括下一个星期一。最有用的是,这种方法避免了确定日期时间的最后一秒的问题,其中一些系统使用毫秒 (x.999)、一些 (x.999999)、相同的纳秒 (x.999999999),而其他系统使用诸如保留 5 个小数位 (x.99999)。相反,我们会上升到但不包括下一小时或一天的第一时刻等。
我发现在我的代码中始终如一地使用半开式方法可以使代码更易于阅读、更易于理解,并且不太可能导致错误的错误。我陷入了无数财务神秘问题,这些问题被证明是对涵盖日期的报告的混淆或误解,包括包含日期和不包含日期。因此,如果可能,请培训您的用户以始终如一的半开放方式思考。如果不可行,请调整您的代码,使您的逻辑和循环至少在内部使用半开。
这里的代码与上面类似,但使用isBefore 而不是NOT isAfter,以使用Half-Open 方法。结局是 2 月 3 日而不是 2 月 2 日。
LocalDate start = LocalDate.of( 2017 , Month.JANUARY , 23 ) ;
LocalDate stop = LocalDate.of( 2017 , Month.FEBRUARY , 3 ) ; // Third instead of the Second of February, to be half-open.
LocalDate ld = start ;
List<LocalDate> dates = new ArrayList<>() ;
while ( ld.isBefore( stop ) ) { // Using "isBefore" for Half-Open approach.
dates.add( ld ); // Collect this date.
ld = ld.plusDays( 1 ) ; // Setup the next loop.
}
看到这个code run live at IdeOne.com。
开始:2017-01-23 |停止:2017-02-03
日期:[2017-01-23、2017-01-24、2017-01-25、2017-01-26、2017-01-27、2017-01-28、2017-01-29、2017- 01-30, 2017-01-31, 2017-02-01, 2017-02-02]
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。