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
时间包有所帮助。不过这些都是非常基本的功能,你应该随时添加自己项目中常用的功能。 欢迎你提出反馈和建议,请在下面的留言区添加。