Browse Source

指标期数位移-bug修改

gmy 5 months ago
parent
commit
9be5a6ed55
1 changed files with 28 additions and 4 deletions
  1. 28 4
      utils/common.go

+ 28 - 4
utils/common.go

@@ -1547,8 +1547,30 @@ func daysInMonth(year int, month time.Month) int {
 	return 31
 }
 
-// CalculateEndOfMonth 计算从 baseDate 开始经过 months 后目标月的最后一天距离 baseDate 的天数差
+// CalculateEndOfMonth 使用天数计算未来月末的天数差
 func CalculateEndOfMonth(baseDate time.Time, months, moveType int) int {
+	// 假设每个月28天,然后算到目标月的下个月
+	daysToAdd := 28 * (months + 2)
+	// 计算目标月的下个月月初
+	if moveType == 2 {
+		daysToAdd = -(daysToAdd - 56)
+	}
+	nextMonth := baseDate.AddDate(0, 0, daysToAdd)
+
+	// 获取目标月月初的第一天
+	firstDayOfNextMonth := time.Date(nextMonth.Year(), nextMonth.Month(), 1, 0, 0, 0, 0, nextMonth.Location())
+
+	// 获取目标月的最后一天(即月初减去1天)
+	lastDayOfTargetMonth := firstDayOfNextMonth.AddDate(0, 0, -1)
+
+	// 计算天数差
+	daysDifference := int(math.Abs(lastDayOfTargetMonth.Sub(baseDate).Hours() / 24))
+
+	return daysDifference
+}
+
+// CalculateEndOfMonth 计算从 baseDate 开始经过 months 后目标月的最后一天距离 baseDate 的天数差
+/*func CalculateEndOfMonth(baseDate time.Time, months, moveType int) int {
 	// 初始化目标日期
 	targetDate := baseDate
 
@@ -1560,7 +1582,8 @@ func CalculateEndOfMonth(baseDate time.Time, months, moveType int) int {
 	// 手动计算目标月份,通过加月份天数循环处理
 	for i := 0; i < int(math.Abs(float64(months))); i++ {
 		// 获取当前月份的天数
-		days := daysInMonth(targetDate.Year(), targetDate.Month())
+
+		days := daysInMonth(targetDate.Year(), targetDate.Month()+1)
 
 		// 根据 moveType 来前进或后退天数
 		if months > 0 {
@@ -1580,7 +1603,7 @@ func CalculateEndOfMonth(baseDate time.Time, months, moveType int) int {
 	daysDifference := int(math.Abs(lastDayOfTargetMonth.Sub(baseDate).Hours() / 24))
 
 	return daysDifference
-}
+}*/
 
 // CalculateDekadTime 计算旬度时间
 func CalculateDekadTime(baseDate time.Time, tradingDays, moveType int) int {
@@ -1615,7 +1638,8 @@ func adjustToNearestDekad(date time.Time) time.Time {
 	day := date.Day()
 	lastDayOfMonth := getLastDayOfMonth(date).Day()
 
-	if day <= 11 {
+	// 这里有些无可奈何了,暂时这么写吧。。。需要跟据润 平年根据每个月进行单独处理
+	if day > 5 && day <= 11 {
 		return time.Date(date.Year(), date.Month(), 10, 0, 0, 0, 0, date.Location())
 	} else if day <= 21 {
 		return time.Date(date.Year(), date.Month(), 20, 0, 0, 0, 0, date.Location())