3 回答

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超6個(gè)贊
保持簡單。
Go 時(shí)間包標(biāo)準(zhǔn)化日期:
月、日、小時(shí)、分鐘、秒和納秒值可能超出它們通常的范圍,并且將在轉(zhuǎn)換過程中被歸一化。例如,10 月 32 日轉(zhuǎn)換為 11 月 1 日。
對于一個(gè)月中的天數(shù)
func DaysInMonth(t time.Time) int {
y, m, _ := t.Date()
return time.Date(y, m+1, 0, 0, 0, 0, 0, time.UTC).Day()
}
對于一個(gè)月中的天數(shù)列表
func ListDaysInMonth(t time.Time) []int {
days := make([]int, DaysInMonth(t))
for i := range days {
days[i] = i + 1
}
return days
}

TA貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超6個(gè)贊
一個(gè)月中的天數(shù)始終介于1給定月份的天數(shù)之間。所以主要任務(wù)是確定給定月份的天數(shù)。
該time包不公開此類功能,但您可以使用以下技巧:
// Max days in year y1, month M1
t := time.Date(y1, M1, 32, 0, 0, 0, 0, time.UTC)
daysInMonth := 32 - t.Day()
這背后的邏輯是該天數(shù)32大于任何月份的最大天數(shù)。它將自動(dòng)歸一化(額外的天數(shù)滾動(dòng)到下個(gè)月,天數(shù)適當(dāng)減少)。當(dāng)我們從 中減去歸一化后的天數(shù)時(shí)32,我們會(huì)得到該月的最后一天。
此片段取自答案time.Since() with months and years。
[]int所以這里有一個(gè)小幫手,它返回給定的一個(gè)月中的天數(shù)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]
另一個(gè)不太有效的選擇是將日期回滾到該月的第一天,并開始添加天數(shù)直到月份發(fā)生變化。這就是它的樣子:
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試試這個(gè)。
由于所有月份至少包含 28 天,我們可以優(yōu)化上述解決方案以滾動(dòng)到第 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試試這個(gè)。

TA貢獻(xiàn)1833條經(jīng)驗(yàn) 獲得超4個(gè)贊
有很多方法可以完成它,因?yàn)槲覀冎饕幚沓A?,如果是閏年(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 關(guān)注
- 188 瀏覽
添加回答
舉報(bào)