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 } }
三、手动计算逻辑(理解底层原理)
如果想手动实现逻辑,核心是计算当前日期相对于当月第一天的周偏移,再向上取整:
- 获取当月第一天是一周的第几天
- 计算当前日期是当月的第N天
- 补上第一天到周首的偏移量后,除以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
相关产品推荐
相关产品推荐

