全干工程师

golang-time-example

Golang 很实用的时间功能

Golang有一个时间包,在大多数情况下都能解决与时间相关的复杂问题。与其他编程语言不同,它不包含所有可直接使用的默认实用程序,如添加一天或减去一天等。不过,人们可以使用它的默认方法来构建自己的需求。

在本教程中,我们将讨论一些实用程序,如添加天数或查找时间戳之间的差异等。这些工具我们经常使用,但在库级别却无法使用。愿这篇文章能为你节省一些时间!

除了时间包,你不需要更多依赖包,让我们现在开始吧!

给定时间增加天数或减少天数

此函数将添加给定时间戳中的天数。也可用于添加年或月。

当然,也有一个函数**Add()**可以用来给给定日期添加天数。但它不是添加天数,而是添加小时数。基本上可以这样写t.Add(day * 24).

不过,建议使用AddDate()而不是Add(),因为基于小时的计算在夏令时并不准确。

func AddDays(t time.Time, days int) time.Time {
	fmt.Println("开始时间: ", t)
	// AddDate(years int, months int, days int)
	newTime := t.AddDate(0, 0, days)
	fmt.Println("变更时间: ", newTime)
	return newTime
}

/* 在当前时间基础上添加 2 天 */
AddDays(time.Now(), 2)
//output:
开始时间:  2023-12-31 21:22:04.926295 +0800 CST m=+0.000194220
变更时间:  2024-01-02 21:22:04.926295 +0800 CST
/* 从当前时间减去 2 天 */
AddDays(time.Now(), -2)
//output:
开始时间:  2023-12-31 21:22:04.926542 +0800 CST m=+0.000440655
变更时间:  2023-12-29 21:22:04.926542 +0800 CST

由于time包不包含天数减法,因此只能使用**Add()**进行减法,但必须是负数。

获取时间当天开始时间

要从给定的时间戳中取出一天的开始时间,我们首先需要找出给定时间戳的年、月、日。然后,将小时、分钟和秒清零,就可以得到指定时区的起始时间。

func StartOfDay(t time.Time, timezone string) time.Time {
	location, _ := time.LoadLocation(timezone)
	year, month, day := t.In(location).Date()
	fmt.Println("当前时间: ", t)
	dayStartTime := time.Date(year, month, day, 0, 0, 0, 0, location)
	fmt.Println("开始时间: ", dayStartTime)
	return dayStartTime
}
/* 获取给定时间当天的开始 */
StartOfDay(time.Now(), "Asia/Shanghai")
//output:
当前时间:  2023-12-31 21:28:00.432802 +0800 CST m=+0.000474724
开始时间:  2023-12-31 00:00:00 +0800 CST

获取时间当天结束时间

要获得结束时间,我们只需将小时、分钟和秒分别改为 23、59 和 59。 此外,我们还可以用这种方法获取 24 小时内的任何时间以及特定的时区。

func EndOfDay(t time.Time, timezone string) time.Time {
	location, _ := time.LoadLocation(timezone)
	year, month, day := t.In(location).Date()
	fmt.Println("当前时间: ", t)
	dayEndTime := time.Date(year, month, day, 23, 59, 59, 0, location)
	fmt.Println("结束时间: ", dayEndTime)
	return dayEndTime
}
/* 获取给定时间当天的结束 */
EndOfDay(time.Now(), "Asia/Shanghai")
//output:
当前时间:  2023-12-31 21:32:39.388477 +0800 CST m=+0.000412826
结束时间:  2023-12-31 23:59:59 +0800 CST

检查两时间是否同一天

要确定两个给定的时间戳是否为同一天,我们需要比较年份和当天年号(年里的第几天: 比如年里第364天)。

func IsSameDay(first time.Time, second time.Time) bool {
	return first.YearDay() == second.YearDay() && first.Year() == second.Year()
}

/* 检查给定的两天是否同一天 */
func main() {
	location, _ := time.LoadLocation("Asia/Shanghai")  
	first := time.Date(2023, time.December, 31, 12, 30, 20, 0, location)  
	second := time.Date(2023, time.December, 30, 0, 0, 50, 0, location)  
	  
	three := time.Date(2023, time.December, 30, 12, 0, 50, 0, location)  
	fmt.Println("两时间是否同一天: ", IsSameDay(first, second))  
	fmt.Println("两时间是否同一天: ", IsSameDay(three, second))
}
//output:
两时间是否同一天:  false
两时间是否同一天:  true

两时间间隔的天数

时间包以小时、分钟和秒为单位提供两个时间之间的差值(而不是天数)。要计算两个时间之间的天数,可以用两个时间之间的小时数除以24。这样就能得出两个时间之间的天数。

func DiffInDays(start time.Time, end time.Time) int {
	return int(end.Sub(start).Hours() / 24)
}
func main() {
	location, _ := time.LoadLocation("Asia/Shanghai")  
	first := time.Date(2023, time.December, 31, 12, 30, 20, 0, location)  
	second := time.Date(2023, time.December, 30, 0, 0, 50, 0, location)
	fmt.Println("相隔天数: ", DiffInDays(second, first))
}

//output:
相隔天数:  1

获两时间星期几的数量

  
func AddDays(t time.Time, days int) time.Time {  
    fmt.Println("currentTime: ", t)  
    // AddDate(years int, months int, days int)  
	newTime := t.AddDate(0, 0, days)  
    fmt.Println("newTime: ", newTime)  
    return newTime  
}

func FindNoOfDays(weekDay int, start time.Time, end time.Time) int {  
	totalDays := 0  
	for start.Before(end) {  
	     if int(start.Weekday()) == weekDay {  
	          totalDays += 1  
		 }  
	     start = AddDays(start, 1)  
	}  
    return totalDays  
}
fun main() {
	start := time.Now()  
	end := time.Now().AddDate(0, 0, 20)  
	days := FindNoOfDays(1, start, end)  
	fmt.Println("开始时间:", start, " 和结束时间:", end, "星期一天数的数量: ", days)
}
// output:
开始时间: 2023-12-31 22:08:15.725695 +0800 CST m=+0.000563383  和结束时间: 2024-01-20 22:08:15.725695 +0800 CST 星期一天数的数量:  3

检测年份是否为闰年

每当我们计算时间时,往往需要计算天数,而天数可以随年份而变化(比如闰年),尤其是二月。然而闰年是在 4 年间隔之后重复出现的,我们还是要将其考虑在内。下面的代码可以帮助我们判断某一年是否是闰年。

func IsLeapYear(year int) bool {
	return year%4 == 0 && year%100 != 0 || year%400 == 0
}
func main() {
	fmt.Println("2023 是否闰年: ", IsLeapYear(2023))  
	fmt.Println("2024 是否闰年: ", IsLeapYear(2024))
}
//output:
2023 是否闰年:  false
2024 是否闰年:  true

总结

今天就到此为止。希望这些片段能对你使用Golang时间包有所帮助。不过这些都是非常基本的功能,你应该随时添加自己项目中常用的功能。 欢迎你提出反馈和建议,请在下面的留言区添加。

相关程序解答推荐

留言