java在一个月内的不同周找到了几天

时间:2016-12-05 10:19:21

标签: java date calendar

我想找回一个月四五周的日子。 例如,如果我将输入作为“2016年12月” - 那么我应该得到如下的日子

第一周1,2,3,4 第二周5,6,7,8,9,10,11 第三周12,13,14,15,16,17,18 第四周19,20,21,22,23,24,25 第五周26,27,28,29

我尝试使用calendar,但代码太多 - 如果您有任何已知的解决方案,请提出建议。

我正在使用java 8 - 所以如果可以使用Localdate,那就太棒了

2 个答案:

答案 0 :(得分:2)

定义“一周的一周”

首先,您必须明确“月份周”的含义。第1周是否包含本月的第一天?是这样,周末什么时候结束,周日?星期六?

或者第一周是包含第一个星期一的那个?第一个星期天?

TemporalAdjuster

java.time类包含用于操作日期时间对象以生成另一个的接口TemporalAdjuster

TemporalAdjusters类(注意复数's')提供了几种实现。一个是dayOfWeekInMonth来回答诸如“今年三月的第二个星期二”之类的问题。

仔细阅读该调整员的课程文档。

ISO 8601

ISO 8601标准定义了日期时间值的合理文本表示。我建议你坚持使用这些而不是自己制作。

因此,请使用Dec 2016

,而不是2016-12

默认情况下,java.time类使用ISO 8601格式。例如,YearMonth类可以直接解析并生成2016-12等值。

YearMonth ym = YearMonth.of( 2016 , 12 );

...或者,为清晰起见,请使用Month枚举对象...

YearMonth ym = YearMonth.of( 2016 , Month.DECEMBER );

调用toString生成ISO 8601格式的字符串。

  

ym:toString():2016-12

YearMonth ym = YearMonth.parse( "2016-12" );

LocalDate类表示没有时间且没有时区的仅限日期的值。 YearMonth对象可以为其当月的第一天和最后一天提供LocalDate

实施例

如果您将星期几定义为从1日开始到星期日结束,那么请执行以下操作。每天递增,打印每个月的一天的数字。测试每一天的每周,看看它是否是一周的最后一天(按照你自己的定义),因此需要换行到新的一行。

如果绝对必要,您可以优化此代码。并且您可能希望将其清理为最后不打印逗号。但它会让你朝着正确的方向前进。

YearMonth ym = YearMonth.parse( "2016-12" );
LocalDate firstOfMonth = ym.atDay( 1 ); 
LocalDate lastOfMonth = ym.atEndOfMonth();
int nthWeek = 1;

LocalDate ld = firstOfMonth;
while( ! ld.isAfter( lastOfMonth ) ) {
    System.out.print( ld.getDayOfMonth() + ", " );
    if( ld.getDayOfWeek().equals( DayOfWeek.SUNDAY ) ) {
        System.out.println( "" ); // Wrap to next line.
    }
    ld = ld.plusDays( 1 );  // Setup for next loop.
}

System.out.println( "\nDone." );

请参阅live code in IdeOne.com

  

1,2,3,4,

     

5,6,7,8,9,10,11,

     

12,13,14,15,16,17,18,

     

19,20,21,22,23,24,25,

     

26,27,28,29,30,31,

     

完成。

答案 1 :(得分:1)

这是解决方案

package mypackage;

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.time.temporal.TemporalAdjusters;
import java.time.temporal.ChronoUnit;


public class DataUtil {

    public static void main(String[] args) {
        List<String> weeks = new ArrayList<>();

        LocalDate firstDayOfMonth = LocalDate.of(2016, 12 , 1);
        LocalDate firstWeekendOfMonth= firstDayOfMonth.with( TemporalAdjusters.firstInMonth(DayOfWeek.SUNDAY));

        long firstWeekGap = ChronoUnit.DAYS.between(firstDayOfMonth , firstWeekendOfMonth) ;

        String daysInWeek = buildDaysInWeek(1,12,2016);
        weeks.add("{" + daysInWeek +"}");


        for ( int i = ((int)firstWeekGap +1 )  ; i <= 31 ; i = i+7  )
        {
            daysInWeek = buildDaysInWeek(i,12,2016);
            weeks.add("{" + daysInWeek +"}");

        }

        System.out.println(  " weeks " + weeks);


    }

    private static String buildDaysInWeek(int date,int month, int year)
    {
        StringBuffer daysInWeek = new StringBuffer();

        LocalDate startDate = LocalDate.of(year , month , date);

        daysInWeek.append(startDate.getDayOfMonth());

        LocalDate endOfWeek = startDate ;
        while (  endOfWeek.getDayOfWeek() != DayOfWeek.SATURDAY )
        {
            endOfWeek = endOfWeek.plusDays(1);
            daysInWeek.append(",");
            daysInWeek.append(endOfWeek.getDayOfMonth());
        }

        return daysInWeek.toString();
    }
}