計算日期屬于當月第幾周(日期周計算)
本文周計算時間方式為:當月第一個周一為第一周 計算
- 擷取月第一個周一、從當月第一天開始找
- 第一個周一時間與 sourceTime [傳入時間對比],sourceTime在第一個周一時間之前 表示屬于上月的
- sourceTime 與第一個周一時間差,再以7天計算
/**
* @author aiyuan
* @date 2021/7/27
*/
public class DateWeekUtil {
/**
*擷取當月第一天
*/
public static LocalDateTime getFirstLocalDayOfMonth(LocalDateTime localDateTime) {
return localDateTime.with(TemporalAdjusters.firstDayOfMonth()).with(LocalTime.MIN);
}
/**
*擷取當月第一周 以第一個周一為準
*/
private static LocalDateTime getFirstMonday(LocalDateTime sourceTime) {
LocalDateTime firstMondayOfMonth = getFirstLocalDayOfMonth(sourceTime);
for (int i = 0; i < 6; i++) {
DayOfWeek dayOfWeekTemp = firstMondayOfMonth.getDayOfWeek();
if (dayOfWeekTemp.equals(DayOfWeek.MONDAY)) {
break;
}
//往後推一天
firstMondayOfMonth = firstMondayOfMonth.plusDays(1);
}
return firstMondayOfMonth;
}
/**
* 擷取幾月份的第幾周 [X月份第X周]
*
*/
public static String getMonthNoAndWeekNo(LocalDateTime sourceTime) {
String monthNoAndWeekNo;
//擷取當月的第一天
//擷取月第一個周一,從當月第一天開始找
LocalDateTime firstMondayOfMonth = getFirstMonday(sourceTime);
//比較當月的第一個星期一 < = 參數時間
if (firstMondayOfMonth.isBefore(sourceTime) || firstMondayOfMonth.isEqual(sourceTime)) {
//當月第一個周一在目前時間之前 firstMondayOfMonth<=sourceTime
//計算兩個時間間隔天數
int dayOfMonthFirstMonday = firstMondayOfMonth.getDayOfMonth();
int dayOfMonthSourceTime = sourceTime.getDayOfMonth();
int diffDays = dayOfMonthSourceTime - dayOfMonthFirstMonday;
//第幾周weekNo
int weekNo = (diffDays / 7) + 1;
//月份
int monthNo = sourceTime.getMonth().getValue();
monthNoAndWeekNo = monthNo + "月份" + "第" + weekNo + "周";
} else {
//如果當月的第一個周一大于參數時間,則要計算到上個月份去
//擷取上一個月的第一個周一
LocalDateTime lastMontLocalDateTime = sourceTime.minusMonths(1);
//上個月的第一天
//從上個月的第一天開始找周一
LocalDateTime firstMondayOfMonthLast = getFirstMonday(lastMontLocalDateTime);
// 計算兩個時間間隔天數 (上月第一個周一 減去 目前時間)
Duration duration = Duration.between(firstMondayOfMonthLast, sourceTime);
long diffDays = duration.toDays(); //相差的天數
//第幾周weekNo
long weekNo = (diffDays / 7) + 1;
//月份
int monthNo = firstMondayOfMonthLast.getMonth().getValue();//漢字版月份
monthNoAndWeekNo = monthNo + "月份" + "第" + weekNo + "周";
}
return monthNoAndWeekNo;
}
}