慕码人8056858
一个月中的天数始终介于1给定月份的天数之间。所以主要任务是确定给定月份的天数。该time包不公开此类功能,但您可以使用以下技巧:// Max days in year y1, month M1t := time.Date(y1, M1, 32, 0, 0, 0, 0, time.UTC)daysInMonth := 32 - t.Day()这背后的逻辑是该天数32大于任何月份的最大天数。它将自动归一化(额外的天数滚动到下个月,天数适当减少)。当我们从 中减去归一化后的天数时32,我们会得到该月的最后一天。此片段取自答案time.Since() with months and years。[]int所以这里有一个小帮手,它返回给定的一个月中的天数time.Time:func daysInMonth(t time.Time) []int { t = time.Date(t.Year(), t.Month(), 32, 0, 0, 0, 0, time.UTC) daysInMonth := 32 - t.Day() days := make([]int, daysInMonth) for i := range days { days[i] = i + 1 } return days}测试它:fmt.Println(daysInMonth(time.Date(2022, 1, 1, 0, 0, 0, 0, time.UTC)))fmt.Println(daysInMonth(time.Date(2022, 2, 1, 0, 0, 0, 0, time.UTC)))fmt.Println(daysInMonth(time.Date(2020, 2, 1, 0, 0, 0, 0, time.UTC)))输出(在 Go Playground 上尝试):[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31][1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28][1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29]另一个不太有效的选择是将日期回滚到该月的第一天,并开始添加天数直到月份发生变化。这就是它的样子:func daysInMonth(t time.Time) []int { var days []int // Roll back to day 1 t = time.Date(t.Year(), t.Month(), 1, 0, 0, 0, 0, time.UTC) m := t.Month() for t.Month() == m { days = append(days, t.Day()) t = t.AddDate(0, 0, 1) } return days}这将输出相同的。在Go Playground试试这个。由于所有月份至少包含 28 天,我们可以优化上述解决方案以滚动到第 29 天,并从那里开始检查和递增:func daysInMonth(t time.Time) []int { days := make([]int, 28, 31) for i := range days { days[i] = i + 1 } m := t.Month() // Roll to day 29 t = time.Date(t.Year(), t.Month(), 29, 0, 0, 0, 0, time.UTC) for t.Month() == m { days = append(days, t.Day()) t = t.AddDate(0, 0, 1) } return days}在Go Playground试试这个。
潇潇雨雨
有很多方法可以完成它,因为我们主要处理常量,如果是闰年(29 天),我们只需要处理二月。package mainimport ( "fmt" "time")func main() { fmt.Println(list_of_days())}func list_of_days() []int { non_leap_year := map[string]int{ "January": 31, "February": 28, "March": 31, "April": 30, "May": 31, "June": 30, "July": 31, "August": 31, "September": 30, "October": 31, "November": 30, "December": 31, } leap_year := map[string]int{ "January": 31, "February": 29, "March": 31, "April": 30, "May": 31, "June": 30, "July": 31, "August": 31, "September": 30, "October": 31, "November": 30, "December": 31, } //get the current month year, month, _ := time.Now().Date() //handle leap year no_of_days := 0 if year%4 == 0 && year%100 != 0 || year%400 == 0 { no_of_days = leap_year[month.String()] } else { no_of_days = non_leap_year[month.String()] } days := make([]int, no_of_days) for i := range days { days[i] = i + 1 } return days}