Files
smartmate/backend/conv/time.go
LoveLosita 79b6be5f40 Version: 0.1.3.dev.260208
refactor: ♻️ 重命名部分接口接收器以避免与 dao 层包名冲突

- 调整部分接口接收器命名,避免与 dao 层包名重名 🧩

feat: 📅 新增获取用户今日日程接口并完成实现

fix: 🐛 修复现实日期与相对日期转换逻辑中的初始化时序问题

- 修复 conv/time.go 中日期转换函数的一个 bug ⏱️
- 解决 viper 在包级变量初始化时机过早的问题
- 避免因过早初始化导致无法读取配置中的学期开学/结束时间 📆
2026-02-08 19:09:40 +08:00

58 lines
2.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package conv
import (
"errors"
"time"
"github.com/LoveLosita/smartflow/backend/respond"
"github.com/spf13/viper"
)
// DateFormat 此处定义基准学期的开始和结束日期
const DateFormat = "2006-01-02"
// RealDateToRelativeDate 将绝对日期转换为相对日期(格式: "week-day"
func RealDateToRelativeDate(realDate string) (int, int, error) {
SemesterStartDate := viper.GetString("time.semesterStartDate") // 从配置文件中读取学期开始日期
SemesterEndDate := viper.GetString("time.semesterEndDate") // 从配置文件中读取学期结束日期
t, err := time.Parse(DateFormat, realDate)
if err != nil {
return 0, 0, err
}
start, err := time.Parse(DateFormat, SemesterStartDate)
if err != nil {
return 0, 0, err
}
end, err := time.Parse(DateFormat, SemesterEndDate)
if err != nil {
return 0, 0, err
}
// 边界校验:日期必须在学期范围内
if t.Before(start) || t.After(end) {
return 0, 0, errors.New("日期超出学期范围")
}
// 计算天数差值注意24小时为一个基准天
days := int(t.Sub(start).Hours() / 24)
// 计算周数和星期
// 假设 SemesterStartDate 对应第 1 周,周 1
week := (days / 7) + 1
dayOfWeek := (days % 7) + 1
return week, dayOfWeek, nil
}
// RelativeDateToRealDate 将相对日期转换为绝对日期(输入格式: "week-day"
func RelativeDateToRealDate(week, dayOfWeek int) (string, error) {
SemesterStartDate := viper.GetString("time.semesterStartDate") // 从配置文件中读取学期开始日期
SemesterEndDate := viper.GetString("time.semesterEndDate") // 从配置文件中读取学期结束日期
start, _ := time.Parse(DateFormat, SemesterStartDate)
// 核心转换逻辑:(周-1)*7 + (天-1)
offsetDays := (week-1)*7 + (dayOfWeek - 1)
targetDate := start.AddDate(0, 0, offsetDays)
// 校验计算出的日期是否超出学期结束日期
end, _ := time.Parse(DateFormat, SemesterEndDate)
if targetDate.After(end) {
return "", respond.TimeOutOfRangeOfThisSemester
}
return targetDate.Format(DateFormat), nil
}