列出当前日期/月份的天数

如何列出当前日期/月份的天数?Exp: 一月有 31 天所以 1 2 3 4 到 31



呼如林
浏览 211回答 3
3回答

慕的地6264312

保持简单。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}

慕码人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}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go