Go语言基础-time包的使用

前言

        在开发过程中,常常可以遇到有些关乎到日期时间等的需求,本文简单介绍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地区时区。在各应用场景中,为消除时区带来的影响,我们常常进行以下三步操作:

  1. 获取用户当地时间

    当用户在应用中输入时间时,通常会使用用户设备的本地时间。您可以使用 JavaScript(在前端)或其他手段获取用户的本地时间。
  2. 转换为 UTC 存储

    将用户的本地时间转换为 UTC,然后存储到数据库或其他持久化存储中。这样可以确保所有时间数据均以统一的方式存储,避免因不同用户的时区差异而导致的混乱。
  3. 使用时转换为当地时间

    当您需要向用户显示时间时,从存储中获取 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类型强行表示时间,故结束后才将该包学会。特此记录,以便后续回顾。

        关于定时器:笔者暂未接触这方面的场景。对于此方法是一知半解。故没写入文中。待笔者接触相关场景后再进行补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值