为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
呼如林 2023-02-21 12:56:50
如何列出当前日期/月份的天数?Exp: 一月有 31 天所以 1 2 3 4 到 31
查看完整描述

3 回答

?
慕的地6264312

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

}


查看完整回答
反对 回复 2023-02-21
?
慕码人8056858

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试试这个。



查看完整回答
反对 回复 2023-02-21
?
潇潇雨雨

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

}



查看完整回答
反对 回复 2023-02-21
  • 3 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信