【问题标题】:how to get a list of dates between two dates in java ? How to include/exclude start date/end date also?如何在java中获取两个日期之间的日期列表?如何也包括/排除开始日期/结束日期?
【发布时间】:2012-08-23 00:03:13
【问题描述】:

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

代码完美运行。但是有一个小问题。我的列表中也没有结束日期。如何选择包含/排除开始日期并包含结束日期? 我可以使用 remove() 和 add() 手动执行此操作,还是 Joda API 可以为我执行此操作?

【问题讨论】:

  • 如果没有一些离散的时间步长,这个问题毫无意义。你想要他们之间的日期在几秒钟内改变吗?小时?
  • 据我所知,我的库 Time4J 是唯一具有可配置的包含或排除间隔边界的 API。在 Joda-Time 等其他 API 中,您必须首先添加一天以包含独占结束日期。

标签: java jodatime


【解决方案1】:

基于on API,貌似没有直接选择include的方法。

一个技巧可能是,只需将 +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);
}

【讨论】:

  • 虽然您的答案满足 OP 问题,但 IMO 这个问题表明他/她缺乏努力。
  • @LuiggiMendoza:有点同意。好吧,除了投票结束,我无能为力。
  • 我是庞大的 Joda API 的新手。所以,我想知道是否有人已经知道这个问题的答案。
  • 仅供参考,Joda-Time 项目现在位于maintenance mode,团队建议迁移到java.time 类。
【解决方案2】:

使用 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 的初始容量上加一。

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&lt;LocalDate&gt;

顺便说一句,这段代码在 Java 9 中变得更简单了,您可以从 LocalDate::datesUntil 方法中获取 Stream&lt;LocalDate。该调用返回一个按顺序排列的日期流。

该方法的一个变体允许您指定增加日期的数量。因此,例如,您可以增加 2 以获得每隔一天的增量,而不是默认的单天增量。


关于java.time

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

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

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    相关资源
    最近更新 更多