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

  • 本文关键字:当前日期 date go
  • 更新时间 :
  • 英文 :


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

一个月中的天数始终在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中减去归一化后的一天时,我们就得到了这个月最后一天的确切数字。

这个片段取自答案时间。Since((用月份和年份。

因此,这里有一个小助手,它将给定的time.Time:的一个月中的天数返回为[]int

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
}

这将输出相同的结果。在围棋场上试试这个。

由于所有月份至少包含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时间包使日期正常化:

月、日、小时、分钟、秒和nsec值可能超出其正常范围,并将在转换过程中进行归一化。例如,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
}

有很多方法可以做到这一点,因为我们主要处理常量,如果是闰年(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
}

相关内容

  • 没有找到相关文章

最新更新