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 關注
- 180 瀏覽
添加回答
舉報