如何获取java中两个日期之间的日期列表?如何包含/排除开始日期/结束日期?

时间:2012-08-23 00:03:14

标签: java jodatime

我已经尝试过堆栈溢出中给出的示例 how to get a list of dates between two dates in java

代码完美无缺。但是有一个小问题。我没有在我的列表中得到结束日期。如何选择包含/排除开始日期并包括结束日期? 是的,我是通过使用remove()和add()手动完成的,或者Joda API可以为我做这个吗?

2 个答案:

答案 0 :(得分:5)

基于on API,似乎没有直接选择包含的方式。

一个黑客可能是,只需添加+1天数。

List<LocalDate> dates = new ArrayList<LocalDate>();
int days = Days.daysBetween(startDate, endDate).getDays()+1;
for (int i=0; i < days; i++) {
    LocalDate d = startDate.withFieldAdded(DurationFieldType.days(), i);
    dates.add(d);
}

答案 1 :(得分:1)

使用java.time

Joda-Time项目现在位于maintenance mode,团队建议迁移到java.time类。

半开

日期时间工作通常使用半开放方法来定义开头包含的时间范围,结尾是独占。我相信在您的代码和用户业务中始终如一地使用此方法可以使生活更轻松,避免可能导致误解或错误的歧义。

java.time类使用半开放方法。使用PeriodDurationChronUnit类时请记住这一点。

LocalDate start = LocalDate.of( 2017 , 1 , 23 );
LocalDate stop = LocalDate.of( 2017 , 2 , 14 );

List<LocalDate> dates = new ArrayList<>( (int) ChronoUnit.DAYS.between( start , stop ) ) ; 
LocalDate ld = start ;
while( ld.isBefore( stop ) ) {  // Half-open approach, ending is exclusive.
    dates.add( ld );
    // Set up the next loop.
    ld = ld.plusDays( 1 );
}

如果您坚持将结束日期包含在内,请在输入中添加一天。

LocalDate stop = LocalDate.of( 2017 , 2 , 14 ).plusDays( 1 );  // Effectively making ending date inclusive.

......或(A)将while测试的逻辑从isBefore更改为! isAfter,然后(B)将ArrayList的初始容量加1。

List<LocalDate> dates = new ArrayList<>( ( (int) ChronoUnit.DAYS.between( start , stop ) ) + 1 ) ; // Add one to accommodate inclusive ending (*not* Half-Open).
LocalDate ld = start ;
while( ! ld.isAfter( stop ) ) {  // Ending is inclusive (*not* Half-Open). So using "not after" logic rather than "is before". 
    dates.add( ld );
    // Set up the next loop.
    ld = ld.plusDays( 1 );
}

Stream<LocalDate>

顺便说一句,这个代码在Java 9中变得更简单,您可以从LocalDate::datesUntil方法获得Stream<LocalDate。该调用返回一个连续的有序日期流。

该方法的一种变体允许您指定增加日期的金额。因此,例如,您可以增加2来代替默认的单日增量,以获得每隔一天。

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore