|
@@ -1531,20 +1531,49 @@ func getLastDayOfMonth(t time.Time) time.Time {
|
|
|
return time.Date(t.Year(), t.Month(), 1, 0, 0, 0, 0, t.Location()).AddDate(0, 1, -1)
|
|
|
}
|
|
|
|
|
|
-// CalculateEndOfMonth 使用天数计算未来月末的天数差
|
|
|
+// 获取某年某月的天数
|
|
|
+func daysInMonth(year int, month time.Month) int {
|
|
|
+ if month == time.February {
|
|
|
+ // 闰年处理
|
|
|
+ if (year%4 == 0 && year%100 != 0) || (year%400 == 0) {
|
|
|
+ return 29
|
|
|
+ }
|
|
|
+ return 28
|
|
|
+ }
|
|
|
+ // 其他月份
|
|
|
+ if month == time.April || month == time.June || month == time.September || month == time.November {
|
|
|
+ return 30
|
|
|
+ }
|
|
|
+ return 31
|
|
|
+}
|
|
|
+
|
|
|
+// CalculateEndOfMonth 计算从 baseDate 开始经过 months 后目标月的最后一天距离 baseDate 的天数差
|
|
|
func CalculateEndOfMonth(baseDate time.Time, months, moveType int) int {
|
|
|
- // 假设每个月28天,然后算到目标月的下个月
|
|
|
- daysToAdd := 28 * (months + 2)
|
|
|
- // 计算目标月的下个月月初
|
|
|
+ // 初始化目标日期
|
|
|
+ targetDate := baseDate
|
|
|
+
|
|
|
+ // 如果 moveType == 2,倒退月份;否则前进月份
|
|
|
if moveType == 2 {
|
|
|
- daysToAdd = -(daysToAdd - 56)
|
|
|
+ months = -months
|
|
|
+ }
|
|
|
+
|
|
|
+ // 手动计算目标月份,通过加月份天数循环处理
|
|
|
+ for i := 0; i < int(math.Abs(float64(months))); i++ {
|
|
|
+ // 获取当前月份的天数
|
|
|
+ days := daysInMonth(targetDate.Year(), targetDate.Month())
|
|
|
+
|
|
|
+ // 根据 moveType 来前进或后退天数
|
|
|
+ if months > 0 {
|
|
|
+ targetDate = targetDate.AddDate(0, 0, days) // 前进一个月
|
|
|
+ } else {
|
|
|
+ targetDate = targetDate.AddDate(0, 0, -days) // 倒退一个月
|
|
|
+ }
|
|
|
}
|
|
|
- nextMonth := baseDate.AddDate(0, 0, daysToAdd)
|
|
|
|
|
|
- // 获取目标月月初的第一天
|
|
|
- firstDayOfNextMonth := time.Date(nextMonth.Year(), nextMonth.Month(), 1, 0, 0, 0, 0, nextMonth.Location())
|
|
|
+ // 获取目标月的下个月月初第一天
|
|
|
+ firstDayOfNextMonth := time.Date(targetDate.Year(), targetDate.Month()+1, 1, 0, 0, 0, 0, targetDate.Location())
|
|
|
|
|
|
- // 获取目标月的最后一天(即月初减去1天)
|
|
|
+ // 获取目标月的最后一天
|
|
|
lastDayOfTargetMonth := firstDayOfNextMonth.AddDate(0, 0, -1)
|
|
|
|
|
|
// 计算天数差
|