Golang如何获取指定年份的最后一天日期
Golang如何获取指定年份的最后一天日期 如何获取某年的最后一天?我正在尝试创建一个函数,输入一个整数年份(例如2020),返回该年的最后一天,即2020年12月31日。
有人能告诉我如何实现吗?
没问题!
谢谢!下次我需要做类似的事情时,我会采用这种方法!
在处理比年末最后一天更复杂的情况时,记住这一点很有用。
这是否是您要找的内容?
公历日期不遵循常规的算术规则。每个月的天数不同。在闰年和非闰年中,二月的天数也不同。
不要不必要地硬编码日期(如12和31)。让Go的time包来处理这些工作。
func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) TimeDate函数返回与给定地点中该时间对应时区的
yyyy-mm-dd hh:mm:ss + nsec nanoseconds相对应的Time。
月、日、时、分、秒和纳秒的值可以超出其通常范围,并在转换过程中被规范化。例如,10月32日会被转换为11月1日。
为复杂情况lastDateOfMonth编写代码,使用规范化:第0天是上个月的最后一天。然后对lastDateOfYear应用相同的原则。
package main
import (
"fmt"
"time"
)
func lastDateOfYear(year int) time.Time {
return time.Date(year+1, 1, 0, 0, 0, 0, 0, time.UTC)
}
func lastDateOfMonth(year int, month time.Month) time.Time {
return time.Date(year, month+1, 0, 0, 0, 0, 0, time.UTC)
}
func main() {
for y := 2019; y <= 2021; y++ {
fmt.Println(lastDateOfYear(y))
}
fmt.Println()
for y, m := 2020, time.Month(1); m <= 12; m++ {
fmt.Println(lastDateOfMonth(y, m))
}
for y, m := 2021, time.Month(1); m <= 3; m++ {
fmt.Println(lastDateOfMonth(y, m))
}
}

Go Playground - The Go Programming Language
2019-12-31 00:00:00 +0000 UTC
2020-12-31 00:00:00 +0000 UTC
2021-12-31 00:00:00 +0000 UTC
2020-01-31 00:00:00 +0000 UTC
2020-02-29 00:00:00 +0000 UTC
2020-03-31 00:00:00 +0000 UTC
2020-04-30 00:00:00 +0000 UTC
2020-05-31 00:00:00 +0000 UTC
2020-06-30 00:00:00 +0000 UTC
2020-07-31 00:00:00 +0000 UTC
2020-08-31 00:00:00 +0000 UTC
2020-09-30 00:00:00 +0000 UTC
2020-10-31 00:00:00 +0000 UTC
2020-11-30 00:00:00 +0000 UTC
2020-12-31 00:00:00 +0000 UTC
2021-01-31 00:00:00 +0000 UTC
2021-02-28 00:00:00 +0000 UTC
2021-03-31 00:00:00 +0000 UTC
在Go中获取指定年份的最后一天,可以使用time包来实现。以下是两种常见的方法:
方法1:使用time.Date()直接构造
package main
import (
"fmt"
"time"
)
func GetLastDayOfYear(year int) time.Time {
// 构造下一年1月1日的前一天
return time.Date(year, 12, 31, 0, 0, 0, 0, time.UTC)
}
func main() {
year := 2020
lastDay := GetLastDayOfYear(year)
fmt.Printf("%d年的最后一天是: %s\n", year, lastDay.Format("2006年01月02日"))
// 输出: 2020年的最后一天是: 2020年12月31日
}
方法2:使用下一年第一天减1秒
func GetLastDayOfYear2(year int) time.Time {
// 构造下一年1月1日0时0分0秒
nextYear := time.Date(year+1, 1, 1, 0, 0, 0, 0, time.UTC)
// 减去1秒得到上一年的最后一天
return nextYear.Add(-time.Second)
}
func main() {
year := 2020
lastDay := GetLastDayOfYear2(year)
fmt.Printf("%d年的最后一天是: %s\n", year, lastDay.Format("2006-01-02"))
}
方法3:获取最后一天的日期字符串
func GetLastDayString(year int) string {
lastDay := time.Date(year, 12, 31, 0, 0, 0, 0, time.UTC)
return lastDay.Format("2006-01-02")
}
func main() {
fmt.Println(GetLastDayString(2020)) // 输出: 2020-12-31
fmt.Println(GetLastDayString(2021)) // 输出: 2021-12-31
fmt.Println(GetLastDayString(2022)) // 输出: 2022-12-31
}
方法4:处理闰年的2月情况(虽然12月31日固定)
func GetLastDayDetails(year int) (time.Time, string, string) {
lastDay := time.Date(year, 12, 31, 0, 0, 0, 0, time.UTC)
weekday := lastDay.Weekday().String()
dateStr := lastDay.Format("January 2, 2006")
return lastDay, weekday, dateStr
}
func main() {
lastDay, weekday, dateStr := GetLastDayDetails(2020)
fmt.Printf("日期: %s\n", dateStr)
fmt.Printf("星期: %s\n", weekday)
fmt.Printf("完整时间: %v\n", lastDay)
}
第一种方法是最直接的方式,因为12月31日在任何年份都是固定的。如果需要考虑时区,可以修改time.UTC为特定的时区:
func GetLastDayOfYearWithLocation(year int, loc *time.Location) time.Time {
return time.Date(year, 12, 31, 0, 0, 0, 0, loc)
}
func main() {
// 使用本地时区
localLastDay := GetLastDayOfYearWithLocation(2020, time.Local)
fmt.Println(localLastDay)
// 使用上海时区
shanghai, _ := time.LoadLocation("Asia/Shanghai")
shLastDay := GetLastDayOfYearWithLocation(2020, shanghai)
fmt.Println(shLastDay.Format("2006-01-02 15:04:05 MST"))
}

