如何从civil.Date类型获取对应的星期值(如Monday、Sunday)?
实现方案
方案1:转换为标准库time.Time调用原生方法(最推荐)
civil.Date类型本身不内置获取星期的接口,该方案直接复用标准库time包的Weekday()能力,实现成本最低、结果可靠性最高,完全匹配等效需求。
示例代码:
// 先构造civil.Date实例 date := civil.Date{ Year: 2021, Month: time.May, Day: 1, } // 转换为time.Time类型,使用UTC时区即可,因为civil.Date本身不携带时区信息 t := time.Date(date.Year, date.Month, date.Day, 0, 0, 0, 0, time.UTC) weekday := t.Weekday() fmt.Println(weekday) // 输出:Saturday
你也可以封装为通用工具函数:
func GetCivilDateWeekday(d civil.Date) time.Weekday { return time.Date(d.Year, d.Month, d.Day, 0, 0, 0, 0, time.UTC).Weekday() }
返回的time.Weekday类型是标准库定义的星期枚举,直接打印会输出英文星期名称,也可以通过整型值自定义转译其他语言的星期文本。
方案2:基姆拉尔森公式手动计算(无依赖转换)
如果你不想通过time类型转换实现,可以直接用基姆拉尔森星期计算公式直接从年月日计算星期结果,返回结果和time.Weekday完全对齐:
func CalcWeekdayFromCivilDate(d civil.Date) time.Weekday { year := d.Year month := int(d.Month) // 公式逻辑:1、2月算作上一年的13、14月处理 if month < 3 { month += 12 year-- } weekIdx := (d.Day + 2*month + 3*(month+1)/5 + year + year/4 - year/100 + year/400 + 1) % 7 return time.Weekday(weekIdx) }
内容的提问来源于stack exchange,提问作者Turtle203
相关产品推荐
相关产品推荐

