前言
在开发过程中,常常可以遇到有些关乎到日期时间等的需求,本文简单介绍Go语言中time包的几个基本函数用法。有不对之处,敬请指出,感激不尽!
Go中的时间类型
go语言的时间类型为time.Time
time包中常用方法
获取当前时间
//获取当前的时间
now :=time.Now()
//结果2024-09-14 15:06:43.5428272 +0800 CST m=+0.000000001
由此可知Time类型的格式是
日期-时间(时:分:秒.纳秒)-时区偏移-时间标准UTC(utc+8:北京)中国为CST
格式化时间
获取完时间后,我们如何将Time类型转换为我们常常看到的,更方便理解的样子呢。
这时候就得用上time包的另一个方法TimeName.Format()了
//格式化时间
formatTime := now.Format("2006-01-02 15:04:05")
注:必须使用2006-01-02 15:04:05这个时间以确保统一,格式可自行定义
相较于其他语言,Go 语言通过这种方式来定义时间格式,以便开发者能够清晰地理解各个部分所代表的含义
解析字符串【字符串转为Time】
下面介绍由字符串转换为Time类型的函数
func Parse(layout string, value string) (Time, error)
- 参数
layout string
:解析后格式,例如 "2006-01-02 15:04:05" 等。value string
:待解析字符串- 返回值
*Time
:返回一个解析后的Time类型。error
:如果解析失败,返回一个错误
例子:
tmp,err :=time.Parse("2006-01-02","2024-09-14") //解析后时间默认为UTC
if err!=nil{
fmt.Println("转换错误",err)
}
fmt.Println(tmp) //2024-09-14 00:00:00 +0000 UTC
时区转换
由上可知,解析字符串后得到的是UTC地区时区。在各应用场景中,为消除时区带来的影响,我们常常进行以下三步操作:
-
获取用户当地时间:
当用户在应用中输入时间时,通常会使用用户设备的本地时间。您可以使用 JavaScript(在前端)或其他手段获取用户的本地时间。 -
转换为 UTC 存储:
将用户的本地时间转换为 UTC,然后存储到数据库或其他持久化存储中。这样可以确保所有时间数据均以统一的方式存储,避免因不同用户的时区差异而导致的混乱。 -
使用时转换为当地时间:
当您需要向用户显示时间时,从存储中获取 UTC 时间,并将其转换为用户的本地时间。这样可以确保用户看到的时间是他们熟悉和理解的格式。转换为当地时间
转换为当地时间
func LoadLocation(name string) (*Location, error)
- 参数
name string
:时区名称,例如 "America/New_York"、"Asia/Shanghai" 等。- 返回值
*Location
:返回一个指向Location
类型的指针,表示加载的时区信息。error
:如果加载时区失败,返回一个错误
例子:
loc,err := time.LoadLocation("Local")
if err != nil {
fmt.Println("加载时区失败:", err)
return
}
localTime := tmp.In(loc)
fmt.Println(localTime)
//2024-09-14 08:00:00 +0800 CST
time.LoadLocation("Local")
:加载当地时区。time.LoadLocation("Asia/Shanghai")
:加载上海时区。tmp.In(loc)
:将当前时间转换为指定时区的时间。
转换为标准时间
通过time.Now()方法即可实现时区转换
now :=time.Now()
tmp :=now.UTC()
//2024-09-14 15:25:50.0136949 +0800 CST m=+0.000519501
//2024-09-14 07:25:50.0136949 +0000 UTC
时间计算
Add方法:
func (t Time) Add(d Duration) Time
d Duration
:要添加到当前时间的持续时间。Duration
是一个类型,表示时间段,可以是正值也可以是负值。
例子:
fmt.Println("当前时间:",now.Format("2006-01-02 15:04:05"))
ago := now.Add(-48*time.Hour)
fmt.Println("两天前:",ago.Format("2006-01-02 15:04:05"))
//当前时间: 2024-09-14 15:25:50
//两天前: 2024-09-12 15:25:50
Sub方法:
func (t Time) Sub(u Time) Duration
例子:
//计算时间差
duration := now.Sub(ago)
fmt.Println("相隔",duration)
//相隔 48h0m0s
写在最后:
笔者在记账demo时由于对time包的不熟练,导致当时直接使用string类型强行表示时间,故结束后才将该包学会。特此记录,以便后续回顾。
关于定时器:笔者暂未接触这方面的场景。对于此方法是一知半解。故没写入文中。待笔者接触相关场景后再进行补充