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;
        }
    }
}
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐