You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 13:00:00