【问题标题】:Joda time - all mondays between two datesJoda 时间 - 两个日期之间的所有星期一
【发布时间】:2011-11-07 18:20:07
【问题描述】:

我第一次在 Spring 3.0 项目中使用 Joda time api。现在我有一个开始和结束日期,我想获取这两个日期之间所有星期一的日期。我怎样才能做到这一点 ?

我不知道从哪里开始,请有人建议。我查看了Joda Time: How to get dates of weekdays on some date interval? 的帖子,它提供了某种指导,但由于对 joda 的经验很少,它仍然有些模糊。

【问题讨论】:

    标签: java datetime jodatime days


    【解决方案1】:
    LocalDate startDate = new LocalDate(2011, 11, 8);
    LocalDate endDate = new LocalDate(2012, 5, 1);
    
    LocalDate thisMonday = startDate.withDayOfWeek(DateTimeConstants.MONDAY);
    
    if (startDate.isAfter(thisMonday)) {
        startDate = thisMonday.plusWeeks(1); // start on next monday
    } else {
        startDate = thisMonday; // start on this monday
    }
    
    while (startDate.isBefore(endDate)) {
        System.out.println(startDate);
        startDate = startDate.plusWeeks(1);
    }
    

    【讨论】:

    • 有没有办法计算开始日期和结束日期之间的所有天数,但跳过周末或可能跳过星期六或星期日?
    【解决方案2】:

    我最近开发了Lamma,它旨在解决这个确切的用例:

    Dates.from(2011, 11, 8).to(2011, 12, 30).byWeek().on(DayOfWeek.MONDAY).build();
    

    你会得到一个List<Date>的:

    Date(2011,11,14)
    Date(2011,11,21)
    Date(2011,11,28)
    Date(2011,12,5)
    Date(2011,12,12)
    Date(2011,12,19)
    Date(2011,12,26)
    

    【讨论】:

      【解决方案3】:

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

      使用 java.time

      LocalDate 类是 java.time,类似于 Joda-Time LocalDate。仅日期值,没有时间和时区。一个区别是 java.time 避开了工厂方法的构造函数。

      LocalDate start = LocalDate.of( 2011 , 11 , 8 );
      LocalDate stop = LocalDate.of( 2012 , 5 , 1 );
      

      收集星期一。

      List<LocalDate> mondays = new ArrayList<>();
      

      TemporalAdjuster 接口提供了处理日期时间值的类。 TemporalAdjusters 类(注意复数名称)提供了各种实现。我们想要 nextOrSamenext 调整器,传递所需的 DayOfWeek.MONDAY 枚举对象。

      LocalDate monday = start.with( TemporalAdjusters.nextOrSame( DayOfWeek.MONDAY ) );
      while( monday.isBefore( stop ) ) {
          mondays.add( monday );
          // Set up the next loop.
          monday = monday.plusWeeks( 1 );
      }
      

      顺便说一下,通常处理时间跨度的明智方法是半开放式,其中开始是包含,而结束是排他。因此,在上面的代码中,我们运行到但不包括 stop 日期。

      如果结尾是inclusive,则使用isAfter的否定,例如

      while( !monday.isAfter( stop ) ) {
          //...
      }
      

      这里,monday 不在stop 之后表示它在stop 之前或之前。


      关于java.time

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

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

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

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

      从哪里获取 java.time 类?

      【讨论】:

        【解决方案4】:

        此代码获取字符串日期并给出星期日的数量以及所有星期日的日期

        import java.text.DateFormat;
        import java.text.ParseException;
        import java.text.SimpleDateFormat;
        import java.util.Calendar;
        import java.util.Date;
        
        public class FindAllSundays {
        
        
        public static int getNumberofSundays(String d1, String d2) throws Exception { // object
                                                                                        // in
                                                                                        // Date
                                                                                        // form
        
            Date date1 = getDate(d1);
            Date date2 = getDate(d2);
        
            Calendar c1 = Calendar.getInstance();
            c1.setTime(date1);
            Calendar c2 = Calendar.getInstance();
            c2.setTime(date2);
            int sundays = 0;
            while (c2.after(c1)) {
                // System.out.println(" came here ");
                //checks to see if the day1 ....so on next days are sundays if sunday goes inside to increment the counter
                if (c1.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
                    System.out.println(c1.getTime().toString() + " is a sunday ");
                    sundays++;
        
                }
                c1.add(Calendar.DATE, 1);
            }
        
            System.out.println("number of sundays between 2 dates is " + sundays);
        
            return sundays;
        }
        // converts string to date 
        public static Date getDate(String s) {
            DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            Date date = null;
            try {
                date = format.parse(s);
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return date;
        }
        
        public static void main(String[] arg) throws Exception {
            System.out.println(" " + getNumberofSundays("2005-10-07", "2006-10-01"));
        }
        

        }

        【讨论】:

        • 对 OP 的代码做一些解释会很好
        • 作为第一个帖子我仍然没有掌握的窍门将相应改变
        【解决方案5】:
        import java.time.LocalDate;
        import java.util.ArrayList;
        import java.util.List;
        
        public class Get_time {
        
            public  ArrayList<LocalDate> getmondays(String s,String e)
            {
                LocalDate start = LocalDate.parse(s);
                LocalDate end = LocalDate.parse(e);
                List<LocalDate> totalDates_Mondays = new ArrayList<>();
        
                while (!start.isAfter(end)) {
                    totalDates_Mondays.add(start);
                    start = start.plusWeeks(1);
                }
                return (ArrayList<LocalDate>) totalDates_Mondays;
            }
        
            public static void main(String ...s1) {
        
                String mon_start = "1600-08-01";
                String mon_end= "2016-12-29";
                Get_time t=new Get_time();
                System.out.println(t.getmondays(mon_start,mon_end));
            }
        }
        

        【讨论】:

          【解决方案6】:

          在 Java 8 中使用 Stream ,

          LocalDate startDate = LocalDate.of(2019, 2, 1);
          LocalDate endDate = LocalDate.of(2019, 2, 28);
          long numOfDays = ChronoUnit.DAYS.between(startDate, endDate);
          List<LocalDate> daysRange = Stream.iterate(startDate, date -> date.plusDays(1)).limit(numOfDays).filter( date -> date.getDayOfWeek()==DayOfWeek.MONDAY ).collect(Collectors.toList());
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-05-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-28
            • 2013-02-14
            相关资源
            最近更新 更多