Android:如何在选择特定月份和工作日后获取该月的所有日期?

时间:2017-01-04 18:00:41

标签: java android date dayofweek

我已经选择了某个月的旋转器,然后我还创建了一些用于选择特定日期的复选框,那么在选择这些信息后如何显示所有日期?

E.g。如果我选择一月并选择星期一和星期三,我如何显示星期一的所有日期:2 / 1,9 / 1 /,16 / 1,23 / 1,30 / 1和星期三:4 / 1,11 / 1 ,分别是18 / 1,25 / 1?

我期待着您的回复!谢谢!

2 个答案:

答案 0 :(得分:1)

使用此方法,您可以

private String getMondaysOfJanuary() 

        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.MONTH, Calendar.JANUARY); // month starts by 0 = january
        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        cal.set(Calendar.DAY_OF_WEEK_IN_MONTH, 1);
        int month = cal.get(Calendar.MONTH);
        String output = "";
        while (cal.get(Calendar.MONTH) == month) {
            output += cal.get(Calendar.DAY_OF_MONTH) + "/" + (cal.get(Calendar.MONTH)+1) + ",";
            cal.add(Calendar.DAY_OF_MONTH, 7);
        }
        return output.substring(0, output.length-1);
}

用您的数据替换这两行并参数化此方法可以实现目标

cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
cal.set(Calendar.DAY_OF_WEEK_IN_MONTH, 1);

答案 1 :(得分:0)

避免遗留日期时间类

旧的DateCalendar类已被证明是混乱,有缺陷和麻烦的。现在遗留下来,取而代之的是Java 8及更高版本中的java.time类。请参阅下文,了解早期Java和Android的后端口链接。

使用java.time

可以使用DayOfWeek枚举来表示您的星期几复选框背后的数据。该课程提供七个实例,一周中每周一个,周一至周日。

您可以使用EnumSet收集用户所需的日期,这是Enum个对象的特殊高度优化Set实现。

Set<DayOfWeek> daysOfWeek = EnumSet.noneOf( DayOfWeek.class );
daysOfWeek.add( DayOfWeek.MONDAY );
daysOfWeek.add( DayOfWeek.WEDNESDAY );

使用YearMonth对象记住所选的月份和年份。

YearMonth ym = YearMonth.of( 2017 , Month.JANUARY );  // Or ( 2017 , 1 ) for January.

获取该月的第一个日期,表示为LocalDateLocalDate类表示没有时间且没有时区的仅限日期的值。

LocalDate firstOfMonth = ym.atDay( 1 );

在我们的收藏中循环每周。对于每个,确定该月的第一次出现。 Java为第一次出现TemporalAdjuster提供了一个方便的TemporalAdjusters实现。然后一次添加一周,直到我们发现自己在下个月。

for ( DayOfWeek dayOfWeek : daysOfWeek ) {
    List<LocalDate> dates = new ArrayList<> ( 5 );
    LocalDate ld = firstOfMonth.with ( TemporalAdjusters.dayOfWeekInMonth ( 1 , dayOfWeek ) );
    do {
        dates.add ( ld );
        // Set up next loop.
        ld = ld.plusWeeks ( 1 );
    } while ( YearMonth.from ( ld ).equals ( ym ) );  // While in the targeted month.
    System.out.println ( "ym.toString(): " + ym + " | dayOfWeek.toString(): " + dayOfWeek + " | dates: " + dates );
}
  

ym.toString():2017-01 | dayOfWeek.toString():星期一|日期:[2017-01-02,2017-01-09,2017-01-16,2017-01-23,2017-01-30]

     

ym.toString():2017-01 | dayOfWeek.toString():WEDNESDAY |日期:[2017-01-04,2017-01-11,2017-01-18,2017-01-25]

请参阅this code live in IdeOne.com

关于java.time

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

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

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore