【问题标题】:Joda Time: How to get dates of weekdays on some date interval?Joda Time:如何在某个日期间隔内获取工作日的日期?
【发布时间】:2010-12-28 17:02:04
【问题描述】:

我有两个 LocalDates 代表某个时间间隔。现在我必须得到这个间隔包含的所有星期五的 LocalDates。 最简单的方法?

【问题讨论】:

标签: java datetime date jodatime


【解决方案1】:
package org.life.java.so.questions;

import org.joda.time.DateTime;
import org.joda.time.DateTimeConstants;

/**
 *
 * @author Jigar
 */
public class JodaTimeDateTraverseQuestion {
    public static void main(String[] args) {

        DateTime startDt = new DateTime(2010,12,1,0,0,0,0);//1st Dec 2010
        DateTime endDt = new DateTime(2010,12,31,0,0,0,0);//31st Dec 2010
        DateTime tempDate = new DateTime(startDt.getMillis());
        while(tempDate.compareTo(endDt) <=0 ){
            if(tempDate.getDayOfWeek() !=  DateTimeConstants.SATURDAY && tempDate.getDayOfWeek() !=  DateTimeConstants.SUNDAY){
                System.out.println(""+tempDate);
            }
            tempDate = tempDate.plusDays(1);

        }


    }
}

【讨论】:

    【解决方案2】:

    解决方法:懒惰一周。

    import org.joda.time.LocalDate;
    import java.util.Iterator;
    
    public class DayOfWeekIterator implements Iterator<LocalDate>{
        private final LocalDate end;
        private LocalDate nextDate;
    
        public DayOfWeekIterator(LocalDate start, LocalDate end, int dayOfWeekToIterate){
            this.end = end;
            nextDate = start.withDayOfWeek(dayOfWeekToIterate);
            if (start.getDayOfWeek() > dayOfWeekToIterate) {
                nextDate = nextDate.plusWeeks(1);
            }
        }
    
        public boolean hasNext() {
            return !nextDate.isAfter(end);
        }
    
        public LocalDate next() {
            LocalDate result = nextDate;
            nextDate = nextDate.plusWeeks(1);
            return result;
        }
    
        public void remove() {
            throw new UnsupportedOperationException();
        }
     }
    

    测试

    import org.joda.time.DateTimeConstants;
    import org.joda.time.LocalDate;
    
    public class DayOfWeekIteratorTest {
    
        public static void main(String[] args) {
    
            LocalDate startDate = new LocalDate(2010, 12, 1);//1st Dec 2010
            LocalDate endDate = new LocalDate(2010, 12, 31);//31st Dec 2010
            DayOfWeekIterator it = new DayOfWeekIterator(startDate, endDate, DateTimeConstants.FRIDAY);
            while (it.hasNext()) {
                System.out.println(it.next());
            }
    
        }
    }
    

    【讨论】:

      【解决方案3】:

      tl;博士

      java.time.LocalDate.of( 2018 , Month.JANUARY , 23 )  // A date-only class in the modern *java.time* classes that supplant both Joda-Time and the troublesome old date-time classes.
          .with(  
              TemporalAdjusters.next( DayOfWeek.FRIDAY )   // Nifty `TemporalAdjuster` implementation for moving to another date. Immutable Objects pattern means a new object is returned based on the original which remains unmodified.
          )
          .isBefore(                                       // Compare `LocalDate` objects with `isBefore`, `isAfter`, and `isEqual`. 
              LocalDate.of( 2018 , Month.FEBRUARY , 27 );
          )
      

      java.time

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

      定义您的停止和启动LocalDate 对象。

      LocalDate start = LocalDate.of( 2018 , Month.JANUARY , 23 );
      LocalDate stop = LocalDate.of( 2018 , Month.FEBRUARY , 27 );
      // TODO: Verify start.isBefore( stop ).
      

      收集我们找到的星期五日期。您可以通过调整集合的大小来进行一些优化。

      // Pre-size the collection.
      int initialCapacity = ( int ) ( ChronoUnit.WEEKS.between( start , stop ) + 2 ); // Adding two for good measure.
      List < LocalDate > fridays = new ArrayList <>( initialCapacity );
      

      确定第一个星期五,如果它本身是星期五,则使用开始日期。使用TemporalAdjusters 类中提供的一对TemporalAdjuster 实现:next​(DayOfWeek)nextOrSame​(DayOfWeek)。通过DayOfWeek 枚举传递所需的星期几,七个预定义的对象,一个用于星期一至星期日的每一天。

      LocalDate friday = start.with( TemporalAdjusters.nextOrSame( DayOfWeek.FRIDAY ) );
      
      while ( friday.isBefore( stop ) )
      {
          fridays.add( friday );  // Remember this Friday date.
          // Setup next loop.
          friday = friday.with( TemporalAdjusters.next( DayOfWeek.FRIDAY ) );
      }
      
      System.out.println( "From " + start + " to " + stop + " = " + fridays );
      

      从 2018-01-23 到 2018-02-27 = [2018-01-26, 2018-02-02, 2018-02-09, 2018-02-16, 2018-02-23]


      关于java.time

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

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

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

      您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

      从哪里获得 java.time 类?

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

      【讨论】:

        猜你喜欢
        • 2017-04-14
        • 2014-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多