Эх сурвалжийг харах

指标期数位移-bug修改

gmy 4 сар өмнө
parent
commit
a872ff919d
1 өөрчлөгдсөн 38 нэмэгдсэн , 9 устгасан
  1. 38 9
      utils/common.go

+ 38 - 9
utils/common.go

@@ -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)
 
 	// 计算天数差