java中的Date Util,它将以周、月、季、年为单位展开日期范围

java中的Date Util,它将以周、月、季、年为单位展开日期范围,java,date,Java,Date,我正在寻找一个java库,当从开始到现在给出时,它将返回一个以周、月、季度或年为单位的最适用的日期列表。我已经手动完成了这项工作,我想知道这是否已经作为标准包的一部分进行了实现和测试 范例 鉴于2009年1月1日,2009年1月4日,它应该给出2009年1月1日,2009年1月2日,2009年1月3日,2009年1月4日 鉴于2009年1月1日、2009年1月14日,应给出2009年1月1日、2009年1月7日、2009年1月14日 希望您明白:)提供的类有一些方法,例如plusDays(int

我正在寻找一个java库,当从开始到现在给出时,它将返回一个以周、月、季度或年为单位的最适用的日期列表。我已经手动完成了这项工作,我想知道这是否已经作为标准包的一部分进行了实现和测试

范例

鉴于2009年1月1日,2009年1月4日,它应该给出2009年1月1日,2009年1月2日,2009年1月3日,2009年1月4日

鉴于2009年1月1日、2009年1月14日,应给出2009年1月1日、2009年1月7日、2009年1月14日

希望您明白:)

提供的类有一些方法,例如
plusDays(int)
plusWeeks(int)
plusMonths(int)
,这些方法应该会有所帮助

假设您希望以周为单位获取
开始
结束
之间的所有日期(伪代码):

DateTime start=//随便什么
DateTime end=//随便什么
List datesBetween=new ArrayList();

而Jado的替代方案是使用标准java API

Calendar start = // whatever
Calendar end = // whatever

List<Calendar> datesBetween = new ArrayList<Calendar>();

while (start.compareTo(end) <= 0) {
   datesBetween.add(start);
   Calendar dateBetween = start.add(Calendar.DAY_OF_MONTH, 7);
   start = dateBetween;
}
日历开始=//随便什么
日历结束=//随便什么
List datesBetween=new ArrayList();

while(start.compareTo(end)一个示例java实现,它使用jodatime创建一个大范围的日期分割,占用内存最少

java.time 这是正确的,但是已经过时了。团队建议我们应该迁移到java 8和更高版本中内置的java.time框架中。java.time的大部分功能已经实现并进一步扩展

LocalDate
对于仅限日期的值,不带时间和时区,请使用
LocalDate

半开 通常,处理时间跨度的最佳实践称为半开放式。在这种方法中,跨度的开始是包含的,而结束是独占的。因此,使用下面的示例代码,您将看到结果不包括
停止日期。如果您坚持结束是包含的,请更改
日期.isBefore(停止)
!date.isAfter(停止)

示例代码

在目前的状态下,问题是模糊的,而不是解决诸如是否考虑开始日期恰好与周开始或月开始相一致的问题。另一个问题:是否使用半开放的方法。因此,这些问题留给读者作为一个练习。 此代码统计时间跨度内的天数。如果不足一周,我们每天循环。如果超过一周,我们每周循环。同样的逻辑可以扩展到问题中提到的逐月、逐季度和逐年处理

LocalDate start = LocalDate.of ( 2016 , Month.JANUARY , 2 );
LocalDate stop = start.plusDays ( 4 );
// LocalDate stop = start.plusWeeks ( 4 );

long days = ChronoUnit.DAYS.between ( start , stop );
List<LocalDate> dates = new ArrayList<> ();

if ( days == 0 ) {
    dates.add ( start );// Just one date, as start equals stop.

} else if ( days < 7 ) {  // Under a week, count day-by-day.
    LocalDate date = start;
    do {
        dates.add ( date );
        // Prep for next loop.
        date = date.plusDays ( 1 );
    } while ( date.isBefore ( stop ) ); // Using “isBefore” for Half-Open approach where ending is exclusive. For inclusive, use “! isAfter”.

} else if ( days > 7 ) {  // Over a week, count week-by-week.
    LocalDate date = start;
    do {
        dates.add ( date );
        // Prep for next loop.
        date = date.plusWeeks ( 1 );
    } while ( date.isBefore ( stop ) ); // Using “isBefore” for Half-Open approach where ending is exclusive. For inclusive, use “! isAfter”.

} else {
    // FIXME: ERROR. Should not be possible.
}
当使用
stop
添加4天的行运行时:

开始日期:2016-01-02停止日期:2016-01-06日期:[2016-01-022016-01-032016-01-042016-01-05]

当使用
stop
添加4周的行运行时:

开始:2016-01-02 |停止:2016-01-30 |日期:[2016-01-022016-01-092016-01-162016-01-23]


第一个例子指出应该包括开始日期本身,第二个例子与此相矛盾。哪一个是正确的?抱歉-您需要包括开始和结束日期-更新了示例的FYI,项目现在在,团队建议迁移到类中。请参阅.FYI,麻烦的旧日期时间类,如,
java.text.SimpleTextFormat
现在已被类取代。请参阅。
LocalDate start = LocalDate.of ( 2016 , Month.JANUARY , 2 );
LocalDate stop = start.plusDays ( 4 );
// LocalDate stop = start.plusWeeks ( 4 );

long days = ChronoUnit.DAYS.between ( start , stop );
List<LocalDate> dates = new ArrayList<> ();

if ( days == 0 ) {
    dates.add ( start );// Just one date, as start equals stop.

} else if ( days < 7 ) {  // Under a week, count day-by-day.
    LocalDate date = start;
    do {
        dates.add ( date );
        // Prep for next loop.
        date = date.plusDays ( 1 );
    } while ( date.isBefore ( stop ) ); // Using “isBefore” for Half-Open approach where ending is exclusive. For inclusive, use “! isAfter”.

} else if ( days > 7 ) {  // Over a week, count week-by-week.
    LocalDate date = start;
    do {
        dates.add ( date );
        // Prep for next loop.
        date = date.plusWeeks ( 1 );
    } while ( date.isBefore ( stop ) ); // Using “isBefore” for Half-Open approach where ending is exclusive. For inclusive, use “! isAfter”.

} else {
    // FIXME: ERROR. Should not be possible.
}
System.out.println ( "start: " + start + " | stop: " + stop + " | dates: " + dates );