天天看點

Java 計算日期屬于當月第幾周(日期周計算)

作者:能吃能睡的小可

計算日期屬于當月第幾周(日期周計算)

本文周計算時間方式為:當月第一個周一為第一周 計算

  • 擷取月第一個周一、從當月第一天開始找
  • 第一個周一時間與 sourceTime [傳入時間對比],sourceTime在第一個周一時間之前 表示屬于上月的
  • sourceTime 與第一個周一時間差,再以7天計算
/**
 * @author aiyuan
 * @date 2021/7/27
 */
public class DateWeekUtil {


    /**
     *擷取當月第一天
     */
    public static LocalDateTime getFirstLocalDayOfMonth(LocalDateTime localDateTime) {
        return localDateTime.with(TemporalAdjusters.firstDayOfMonth()).with(LocalTime.MIN);
    }

	/**
     *擷取當月第一周  以第一個周一為準
     */
    private static LocalDateTime getFirstMonday(LocalDateTime sourceTime) {
        LocalDateTime firstMondayOfMonth = getFirstLocalDayOfMonth(sourceTime);
        for (int i = 0; i < 6; i++) {
            DayOfWeek dayOfWeekTemp = firstMondayOfMonth.getDayOfWeek();
            if (dayOfWeekTemp.equals(DayOfWeek.MONDAY)) {
                break;
            }
            //往後推一天
            firstMondayOfMonth = firstMondayOfMonth.plusDays(1);
        }
        return firstMondayOfMonth;
    }


    /**
     * 擷取幾月份的第幾周 [X月份第X周]
     *
     */
    public static String getMonthNoAndWeekNo(LocalDateTime sourceTime) {
        String monthNoAndWeekNo;
        //擷取當月的第一天
        //擷取月第一個周一,從當月第一天開始找

        LocalDateTime firstMondayOfMonth = getFirstMonday(sourceTime);

        //比較當月的第一個星期一 < = 參數時間
        if (firstMondayOfMonth.isBefore(sourceTime) || firstMondayOfMonth.isEqual(sourceTime)) {
            //當月第一個周一在目前時間之前 firstMondayOfMonth<=sourceTime
            //計算兩個時間間隔天數
            int dayOfMonthFirstMonday = firstMondayOfMonth.getDayOfMonth();
            int dayOfMonthSourceTime = sourceTime.getDayOfMonth();

            int diffDays = dayOfMonthSourceTime - dayOfMonthFirstMonday;
            //第幾周weekNo
            int weekNo = (diffDays / 7) + 1;
            //月份
            int monthNo = sourceTime.getMonth().getValue();

            monthNoAndWeekNo = monthNo + "月份" + "第" + weekNo + "周";
        } else {
            //如果當月的第一個周一大于參數時間,則要計算到上個月份去
            //擷取上一個月的第一個周一
            LocalDateTime lastMontLocalDateTime = sourceTime.minusMonths(1);
            //上個月的第一天
            //從上個月的第一天開始找周一
            LocalDateTime firstMondayOfMonthLast = getFirstMonday(lastMontLocalDateTime);

            //  計算兩個時間間隔天數 (上月第一個周一 減去 目前時間)
            Duration duration = Duration.between(firstMondayOfMonthLast, sourceTime);
            long diffDays = duration.toDays(); //相差的天數
            //第幾周weekNo
            long weekNo = (diffDays / 7) + 1;
            //月份
            int monthNo = firstMondayOfMonthLast.getMonth().getValue();//漢字版月份

            monthNoAndWeekNo = monthNo + "月份" + "第" + weekNo + "周";
        }

        return monthNoAndWeekNo;
    }


}           

繼續閱讀