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