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


所有评论(0)