Golang如何获取指定年份的最后一天日期

Golang如何获取指定年份的最后一天日期 如何获取某年的最后一天?我正在尝试创建一个函数,输入一个整数年份(例如2020),返回该年的最后一天,即2020年12月31日。

有人能告诉我如何实现吗?

6 回复

是的,非常感谢。

更多关于Golang如何获取指定年份的最后一天日期的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


没问题!

谢谢!下次我需要做类似的事情时,我会采用这种方法!

在处理比年末最后一天更复杂的情况时,记住这一点很有用。

这是否是您要找的内容?

https://play.golang.org/p/Fw2QBjCUqXl

公历日期不遵循常规的算术规则。每个月的天数不同。在闰年和非闰年中,二月的天数也不同。

不要不必要地硬编码日期(如12和31)。让Go的time包来处理这些工作。

func Date

func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time

Date函数返回与给定地点中该时间对应时区的

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

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"))
}
回到顶部