JAvaはLocalDateを用いて開始時間と終了時間から週のリストを算出する

10221 ワード

一般的に私たちはデータ統計の中で出会うことができて、毎日のデータによって、毎週、毎月成約量のデータは展示します
/**
 *  -    
 */
public class Week implements Serializable{

    /**   (2018-06-01~2018-06-10) **/
    private String day;
    /**      **/
    private LocalDate startTime;
    /**      **/
    private LocalDate endTime;
    /**         **/
    private Integer startTimeNumber;
    /**         **/
    private Integer endTimeNumber;
   //  get set  
}
 
  
/**
 *       
 * @param startTime
 * @param endTime
 * @return
 */
public static List getWeekList(LocalDate startTime, LocalDate endTime) {
    List resultList = new ArrayList();
    DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMMdd");

    //       
    WeekFields weekFields = WeekFields.of(DayOfWeek.MONDAY,4);
    if(startTime.get(weekFields.weekOfWeekBasedYear()) == endTime.get(weekFields.weekOfWeekBasedYear())){
        Week firstWeek = new Week();
        firstWeek.setDay(startTime + "~" + endTime);
        firstWeek.setStartTime(startTime);
        firstWeek.setEndTime(endTime);
        firstWeek.setStartTimeNumber(Integer.valueOf(df.format(startTime)));
        firstWeek.setEndTimeNumber(Integer.valueOf(df.format(endTime)));
        resultList.add(firstWeek);
        return resultList;
    }

    //   
    TemporalAdjuster FIRST_OF_WEEK = TemporalAdjusters.ofDateAdjuster(localDate -> localDate.minusDays(localDate.getDayOfWeek().getValue() - DayOfWeek.MONDAY.getValue()));
    LocalDate startFirstWeek = startTime.with(FIRST_OF_WEEK);  //       
    TemporalAdjuster LAST_OF_WEEK = TemporalAdjusters.ofDateAdjuster(localDate -> localDate.plusDays(DayOfWeek.SUNDAY.getValue() - localDate.getDayOfWeek().getValue()));
    LocalDate endFirstWeek = startTime.with(LAST_OF_WEEK);     //       


    //   
    TemporalAdjuster FIRST_OF_WEEK1 = TemporalAdjusters.ofDateAdjuster(localDate -> localDate.minusDays(localDate.getDayOfWeek().getValue() - DayOfWeek.MONDAY.getValue()));
    LocalDate startLastWeek = endTime.with(FIRST_OF_WEEK1);
    TemporalAdjuster LAST_OF_WEEK1 = TemporalAdjusters.ofDateAdjuster(localDate -> localDate.plusDays(DayOfWeek.SUNDAY.getValue() - localDate.getDayOfWeek().getValue()));
    LocalDate endLastWeek = endTime.with(LAST_OF_WEEK1);

    //      
    Week firstWeek = new Week();
    firstWeek.setDay(startTime + "~" + endFirstWeek);
    firstWeek.setStartTime(startTime);
    firstWeek.setEndTime(endFirstWeek);
    firstWeek.setStartTimeNumber(Integer.valueOf(df.format(startTime)));
    firstWeek.setEndTimeNumber(Integer.valueOf(df.format(endFirstWeek)));
    resultList.add(firstWeek);

    while (true) {
        startFirstWeek = startFirstWeek.plusDays(7);
        if (startFirstWeek.with(LAST_OF_WEEK).equals(startLastWeek.with(LAST_OF_WEEK1))) {
            break;
        } else {
            Week week = new Week();
            week.setDay(startFirstWeek.with(FIRST_OF_WEEK) + "~" + startFirstWeek.with(LAST_OF_WEEK));
            week.setStartTime(startFirstWeek.with(FIRST_OF_WEEK));
            week.setEndTime(startFirstWeek.with(LAST_OF_WEEK));
            week.setStartTimeNumber(Integer.valueOf(df.format(startFirstWeek.with(FIRST_OF_WEEK))));
            week.setEndTimeNumber(Integer.valueOf(df.format(startFirstWeek.with(LAST_OF_WEEK))));
            resultList.add(week);
            //System.out.println("  ="+startFirstWeek+"   ="+startFirstWeek.with(FIRST_OF_WEEK)+"   ="+startFirstWeek.with(LAST_OF_WEEK));
        }
    }
    Week lastWeek = new Week();
    lastWeek.setDay(startLastWeek + "~" + endTime);
    lastWeek.setStartTime(startLastWeek);
    lastWeek.setEndTime(endTime);
    lastWeek.setStartTimeNumber(Integer.valueOf(df.format(startLastWeek)));
    lastWeek.setEndTimeNumber(Integer.valueOf(df.format(endTime)));
    resultList.add(lastWeek);
    return resultList;
}
 
結果は次のとおりです.
日付=2018-05-02~2018-05-06開始週=2018-05-02終了週=2018-05-06開始タイムスタンプ=20180502終了タイムスタンプ=20180506日付=2018-05-07~2018-05-13開始週=2018-05-13終了週=2018-05-13開始タイムスタンプ=20180507終了タイムスタンプ=20180513日=2018-05-14開始週=2018-05-14終了週=2018-05-14開始週=2018-05-20開始タイムスタンプ=20180514終了タイムスタンプ=20180520日付=2018-05-21~2018-05-27開始週=2018-05-21終了週=2018-05-27開始タイムスタンプ=20180521終了タイムスタンプ=20180527日付=2018-05-28~2018-06-03開始週=2018-05-28終了週=2018-06-03開始タイムスタンプ=20180528終了タイムスタンプ=20180603日付=2018-06-04開始週=2018-06-04終了週=2018-06-10開始タイムスタンプ=20180604終了タイムスタンプ=201806060日付=2018-06-11~2018-06-17開始週=2018-06-11終了週=2018-06-17開始タイムスタンプ=20180611終了タイムスタンプ=20180617日付=2018-06-18~2018-06-24開始週=2018-06-18終了週=2018-06-24開始タイムスタンプ=20180618終了タイムスタンプ=20180624日付=2018-06-25開始週=2018-06-25終了週=2018-06-30開始タイムスタンプ=20180625終了タイムスタンプ=201806302.LocalDate時間による当月の初日と最終日の照会
LocalDate firstDay = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
LocalDate lastDay = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
System.out.println("     ="+firstDay);
System.out.println("      ="+lastDay);
   :
     =2018-06-01
      =2018-06-30