You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift实现:获取指定日期在当月的周数

获取指定日期在当月的周数解决方案

一、使用Calendar实现(兼容旧Java版本)

直接利用Calendar类的WEEK_OF_MONTH字段即可快速获取结果,其规则完全匹配你的需求:包含当月第一天的周为第1周,后续每7天进入下一周,最后不足7天的部分算作单独一周。

import java.util.Calendar;
import java.util.Date;

public class WeekOfMonthUtil {
    public static int getWeekOfMonth(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        // 可选:若需将周一设为一周起始,取消下方注释
        // calendar.setFirstDayOfWeek(Calendar.MONDAY);
        return calendar.get(Calendar.WEEK_OF_MONTH);
    }

    public static void main(String[] args) {
        // 测试2022/11/30
        Calendar nov30 = Calendar.getInstance();
        nov30.set(2022, Calendar.NOVEMBER, 30);
        System.out.println(getWeekOfMonth(nov30.getTime())); // 输出5

        // 测试2022/12/01
        Calendar dec1 = Calendar.getInstance();
        dec1.set(2022, Calendar.DECEMBER, 1);
        System.out.println(getWeekOfMonth(dec1.getTime())); // 输出1
    }
}

二、使用Java 8+ LocalDate实现(推荐)

Java 8及以上版本推荐使用更简洁的LocalDate API,配合WeekFields可灵活定义周规则:

import java.time.LocalDate;
import java.time.temporal.WeekFields;
import java.util.Locale;

public class WeekOfMonthLocalUtil {
    public static int getWeekOfMonth(LocalDate date) {
        // 使用系统默认Locale的周规则,或自定义周起始(如周一为周首)
        WeekFields weekFields = WeekFields.of(Locale.getDefault());
        // 自定义周一为周首:WeekFields.of(DayOfWeek.MONDAY, 1)
        return date.get(weekFields.weekOfMonth());
    }

    public static void main(String[] args) {
        LocalDate nov30 = LocalDate.of(2022, 11, 30);
        System.out.println(getWeekOfMonth(nov30)); // 输出5

        LocalDate dec1 = LocalDate.of(2022, 12, 1);
        System.out.println(getWeekOfMonth(dec1)); // 输出1
    }
}

三、手动计算逻辑(理解底层原理)

如果想手动实现逻辑,核心是计算当前日期相对于当月第一天的周偏移,再向上取整:

  1. 获取当月第一天是一周的第几天
  2. 计算当前日期是当月的第N天
  3. 补上第一天到周首的偏移量后,除以7向上取整
import java.util.Calendar;
import java.util.Date;

public class ManualWeekCalculator {
    public static int getWeekOfMonthManual(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);

        // 克隆日历对象,获取当月第一天
        Calendar firstDayOfMonth = (Calendar) calendar.clone();
        firstDayOfMonth.set(Calendar.DAY_OF_MONTH, 1);
        int firstDayOfWeek = firstDayOfMonth.get(Calendar.DAY_OF_WEEK);

        // 计算第一天到周首的偏移(周日为一周第1天,偏移量为firstDayOfWeek-1)
        int offset = firstDayOfWeek - 1;
        int totalAdjustedDays = dayOfMonth + offset;

        // 向上取整计算周数
        return (totalAdjustedDays + 6) / 7;
    }

    public static void main(String[] args) {
        Calendar nov30 = Calendar.getInstance();
        nov30.set(2022, Calendar.NOVEMBER, 30);
        System.out.println(getWeekOfMonthManual(nov30.getTime())); // 输出5

        Calendar dec1 = Calendar.getInstance();
        dec1.set(2022, Calendar.DECEMBER, 1);
        System.out.println(getWeekOfMonthManual(dec1.getTime())); // 输出1
    }
}

内容的提问来源于stack exchange,提问作者JacksonPark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 07:55:24