3 回答
TA贡献1817条经验 获得超6个赞
保持简单。
Go 时间包标准化日期:
月、日、小时、分钟、秒和纳秒值可能超出它们通常的范围,并且将在转换过程中被归一化。例如,10 月 32 日转换为 11 月 1 日。
对于一个月中的天数
func DaysInMonth(t time.Time) int {
y, m, _ := t.Date()
return time.Date(y, m+1, 0, 0, 0, 0, 0, time.UTC).Day()
}
对于一个月中的天数列表
func ListDaysInMonth(t time.Time) []int {
days := make([]int, DaysInMonth(t))
for i := range days {
days[i] = i + 1
}
return days
}
TA贡献1803条经验 获得超6个赞
一个月中的天数始终介于1给定月份的天数之间。所以主要任务是确定给定月份的天数。
该time包不公开此类功能,但您可以使用以下技巧:
// Max days in year y1, month M1
t := 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试试这个。
TA贡献1833条经验 获得超4个赞
有很多方法可以完成它,因为我们主要处理常量,如果是闰年(29 天),我们只需要处理二月。
package main
import (
"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
}
- 3 回答
- 0 关注
- 127 浏览
添加回答
举报