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();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;}}
}