【java计算日期属于本月第几周通用方法】

java统计当前日期本月的第几周

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;

public class CurrentWeekOfMonth {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        // 测试用例(可以取消注释测试特定日期)
        // LocalDate today = LocalDate.of(2023, 12, 3); // 测试跨年情况
        // LocalDate today = LocalDate.of(2023, 11, 30); // 测试月末情况
        
        WeekInfo weekInfo = getWeekNumberOfMonth(today);
        System.out.println("当前日期: " + today);
        
        if (weekInfo.isLastWeekOfPreviousMonth()) {
            System.out.println("属于上月第 " + weekInfo.getWeekNumber() + " 周");
        } else {
            System.out.println("是本月第 " + weekInfo.getWeekNumber() + " 周");
        }
    }

    public static WeekInfo getWeekNumberOfMonth(LocalDate date) {
        LocalDate firstDayOfMonth = date.with(TemporalAdjusters.firstDayOfMonth());
        DayOfWeek firstDayOfWeek = firstDayOfMonth.getDayOfWeek();

        // 确定本月第一周的开始日期
        LocalDate startOfFirstWeek;
        if (firstDayOfWeek == DayOfWeek.MONDAY) {
            startOfFirstWeek = firstDayOfMonth;
        } else {
            startOfFirstWeek = firstDayOfMonth.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
        }

        // 如果日期在本月第一周开始之前,则属于上月的最后一周
        if (date.isBefore(startOfFirstWeek)) {
            LocalDate lastDayOfPreviousMonth = firstDayOfMonth.minusDays(1);
            int lastMonthWeekCount = getMonthWeekCount(lastDayOfPreviousMonth);
            return new WeekInfo(lastMonthWeekCount, true);
        }

        // 计算当前日期与第一周开始日期的周数差
        long weeksBetween = java.time.temporal.ChronoUnit.WEEKS.between(startOfFirstWeek, date);
        return new WeekInfo((int) weeksBetween + 1, false);
    }

    // 计算指定日期所在月份的总周数
    private static int getMonthWeekCount(LocalDate dateInMonth) {
        LocalDate firstDay = dateInMonth.with(TemporalAdjusters.firstDayOfMonth());
        LocalDate lastDay = dateInMonth.with(TemporalAdjusters.lastDayOfMonth());
        
        DayOfWeek firstDayOfWeek = firstDay.getDayOfWeek();
        LocalDate startOfFirstWeek;
        
        if (firstDayOfWeek == DayOfWeek.MONDAY) {
            startOfFirstWeek = firstDay;
        } else {
            startOfFirstWeek = firstDay.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
        }
        
        // 如果第一周开始日期在第一天之后,则第一周可能很短
        long weeks = java.time.temporal.ChronoUnit.WEEKS.between(startOfFirstWeek, lastDay) + 1;
        
        // 处理月末最后几天是否构成完整一周
        LocalDate endOfLastWeek = startOfFirstWeek.plusWeeks(weeks - 1).with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
        if (lastDay.isAfter(endOfLastWeek)) {
            weeks++;
        }
        
        return (int) weeks;
    }
    
    // 用于返回周数和是否属于上月的辅助类
    static class WeekInfo {
        private final int weekNumber;
        private final boolean lastWeekOfPreviousMonth;
        
        public WeekInfo(int weekNumber, boolean lastWeekOfPreviousMonth) {
            this.weekNumber = weekNumber;
            this.lastWeekOfPreviousMonth = lastWeekOfPreviousMonth;
        }
        
        public int getWeekNumber() {
            return weekNumber;
        }
        
        public boolean isLastWeekOfPreviousMonth() {
            return lastWeekOfPreviousMonth;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值