代码之家  ›  专栏  ›  技术社区  ›  Bharani

Java中的Date Util将在周、月、季、年爆炸日期范围

  •  4
  • Bharani  · 技术社区  · 15 年前

    我正在寻找一个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日

    希望你明白了:)

    4 回复  |  直到 9 年前
        1
  •  8
  •   Dónal    15 年前

    这个 DateTime 类由提供 Joda Time 有如下方法 plusDays(int) , plusWeeks(int) , plusMonths(int) 这应该有帮助。

    假设你想在 start end 以周为单位(伪代码):

    DateTime start = // whatever
    DateTime end = // whatever
    
    List<DateTime> datesBetween = new ArrayList<DateTime>();
    
    while (start <= end) {
       datesBetween.add(start);
       DateTime dateBetween = start.plusWeeks(1);
       start = dateBetween;
    }
    
        2
  •  3
  •   Joter    13 年前

    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;
    }
    
        3
  •  0
  •   Atul Soman    9 年前

    示例JAVA实现,使用JordaMy创建一个大范围的数据拆分,内存占用最少。

    https://github.com/atulsm/Test_Projects/blob/master/src/DateSplitter.java

        4
  •  0
  •   Community CDub    8 年前

    Java.时间

    这个 Answer by Dónal using Joda-Time 是正确的,但过时了。这个 Joda-Time 团队建议我们应该迁移到Java 8和以后构建的JavaTimeFramework中。java.time的大部分功能 back-ported to Java 6 & 7 进一步 adapted to Android .

    LocalDate

    对于仅限日期的值,如果没有时间和时区,请使用 本地日期 类。

    半开

    通常,处理一段时间的最佳实践称为半开放。在这种方法中,跨度的开始是 包容的 当结尾是 排他性 . 因此,使用下面的示例代码,您将看到结果不包括 stop 日期。如果你坚持结尾是包容的,改变 date.isBefore ( stop ) ! date.isAfter ( stop ) .

    示例代码

    在目前的状态下,这个问题是模糊的,不能解决诸如是否考虑开始日期恰好与周的开始或月的开始时间一致等问题。另一个问题是:是否使用半开放的方法。所以这些问题留给读者作为练习。;-)

    此代码计算时间范围内的天数。如果少于一周,我们一天一天地循环。如果超过一周,我们一周一周地循环。同样的逻辑也可以扩展到按月、按季度和按年处理问题中提到的问题。

    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 );
    

    当与线一起运行时 停止 添加4 :

    开始:2016-01-02停止:2016-01-06日期:【2016-01-02,2016-01-03,2016-01-04,2016-01-05】

    当与线一起运行时 停止 添加4 :

    开始:2016-01-02停止:2016-01-30日期:【2016-01-02,2016-01-09,2016-01-16,2016-01-23】