Roc 1 天之前
父节点
当前提交
fa68cf6560
共有 1 个文件被更改,包括 24 次插入24 次删除
  1. 24 24
      services/assessment_form.go

+ 24 - 24
services/assessment_form.go

@@ -76,40 +76,40 @@ func GenerateAssessmentFormCode() (formCode string, err error) {
 // 规则:某年的第一个周五所在周为该年的第一周
 // 返回:格式化字符串(如"202504")、周数(如4)和所在周的周五日期
 func GetAssessmentWeekAndFriday(t time.Time) (string, int, time.Time) {
-	year := t.Year()
+	baseYear, baseWeek := t.ISOWeek()
+	//fmt.Println(t.Format(FormatDate), "  ", baseYear, baseWeek)
 
-	// 找到该年第一个周五的日期
-	firstFriday := findFirstFriday(year)
-
-	// 计算当前日期与该年第一个周五所在周的第一天(周一)的天数差
-	daysSinceFirstWeek := t.YearDay() - firstFriday.YearDay() + int(firstFriday.Weekday()) - int(time.Monday)
-
-	weekNum := 1
-	if daysSinceFirstWeek > 0 {
-		weekNum += daysSinceFirstWeek / 7
-		if daysSinceFirstWeek%7 != 0 {
-			weekNum++
+	firstDay := time.Date(t.Year(), 1, 1, 0, 0, 0, 0, time.Local)
+	// 如果该年的第1天是周五,那么需要额外处理
+	if firstDay.Weekday() == 5 {
+		// 如果基准年份跟第1天的年份不一致,那么说明是第1周,可是基准拿到的数据是上一年的最后一周,所以需要强制调整为今年的第1周
+		if baseYear != firstDay.Year() {
+			baseYear++
+			baseWeek = 1
+		} else {
+			// 如果基准年份跟第1天的年份一致,那么说明不是第1周,可是基准拿到的周度数据会少1周,所以需要强制加1周
+			baseWeek++
 		}
-	} else {
-		// 如果当前日期在第一个周五所在周之前,则属于上一年的最后一周
-		prevYear := year - 1
-		prevFirstFriday := findFirstFriday(prevYear)
-		daysInPrevYear := daysInYear(prevYear)
+	}
 
-		daysSincePrevFirstWeek := t.YearDay() + (daysInPrevYear - prevFirstFriday.YearDay()) + int(prevFirstFriday.Weekday()) - int(time.Monday)
-		weekNum = daysSincePrevFirstWeek / 7
-		if daysSincePrevFirstWeek%7 != 0 {
-			weekNum++
+	lastDay := time.Date(t.Year(), 12, 31, 0, 0, 0, 0, time.Local)
+	// 如果该年的最后1天是周4,那么需要额外处理
+	if lastDay.Weekday() == 4 {
+		_, lastWeek := lastDay.ISOWeek()
+		// 如果基准周度数跟最后1天的周度数不一致,那么说明是明年的第1周,可是基准拿到的数据是今年的最后一周,所以需要强制调整为明年年的第1周
+		if baseWeek == lastWeek {
+			baseYear++
+			baseWeek = 1
 		}
-		year = prevYear
 	}
 
 	// 计算当前日期所在周的周五
 	currentWeekFriday := findFridayOfWeek(t)
 
 	// 格式化输出
-	formatted := fmt.Sprintf("%04d%02d", year, weekNum)
-	return formatted, weekNum, currentWeekFriday
+	formatted := fmt.Sprintf("%04d%02d", baseYear, baseWeek)
+	//fmt.Println(t.Format(FormatDate), "  ", formatted, "周五的日期:", currentWeekFriday.Format(FormatDate))
+	return formatted, baseWeek, currentWeekFriday
 }
 
 // findFirstFriday 找到某年的第一个周五