Go语言中时间time相关处理方法详解

 更新时间:2024年10月08日 08:52:38   作者:景天科技苑  
在Go语言中,time 包是处理时间和日期的核心,它提供了丰富的函数和方法,用于显示、测量、计算、格式化、解析时间等,本文给大家详细介绍了Go时间time相关处理方法的相关资料,需要的朋友可以参考下

引言

在Go语言中,time 包是处理时间和日期的核心。它提供了丰富的函数和方法,用于显示、测量、计算、格式化、解析时间等。

1. 时间的基本获取

在Go语言中,time.Time 类型用于表示时间。我们可以通过 time.Now() 函数获取当前的时间对象,进而获取年、月、日、时、分、秒等信息。

示例代码

package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Now()
    fmt.Printf("current time: %v\n", now)
    //得到的是time.Time类型的结构体数据,包含 常量:日月年时分秒 周日-周六 方法:获取常量,计算。
    fmt.Printf("current time数据类型: %T\n", now)
        //打印年月日时分秒,得到的都是int类型数据


    year := now.Year()
    month := now.Month()
    day := now.Day()
    hour := now.Hour()
    minute := now.Minute()
    second := now.Second()
        //Printf : 整数补位--02如果不足两位,左侧用0补齐输出


    fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)
}

通过now.Year()等得到的都是int类型数据

在这里插入图片描述

在这里插入图片描述

2. 时间戳的获取与转换

时间戳是自1970年1月1日(08:00:00 GMT)至当前时间的总秒数(或毫秒数)。
Go语言中,可以通过time.Now().Unix()获取秒级时间戳,通过time.Now().UnixNano()获取纳秒级时间戳。

示例代码

package main  
  
import (  
    "fmt"  
    "time"  
)  
  
func main() {  
    now := time.Now()  
    timestamp1 := now.Unix()         // 秒级时间戳  
    timestamp2 := now.UnixNano()     // 纳秒级时间戳  
      
    fmt.Printf("current timestamp1: %v\n", timestamp1)  
    fmt.Printf("current timestamp2: %v\n", timestamp2)  
      
    // 将时间戳转换为时间对象  
    timeObj := time.Unix(timestamp1, 0)  
    fmt.Println(timeObj)  
      
    // 转换为指定时区的时间对象  
    secondsEastOfUTC := int((8 * time.Hour).Seconds())  
    beijing := time.FixedZone("Beijing Time", secondsEastOfUTC)  
    beijingTimeObj := time.Unix(timestamp1, 0).In(beijing)  
    fmt.Println(beijingTimeObj)  
}

在这里插入图片描述

通过time.Now().Unix()获取的时间戳是int64数据类型

在这里插入图片描述

如果想要通过时间戳字符串转化为时间格式,需要将时间戳字符串转化为int64类型数据

package main

import (
    "fmt"
    "strconv"
    "time"
)

func main() {
    //时间戳字符串
    timrstr := "1617922800"

    //时间戳是int64类型数据,将时间戳字符串转化为int64类型
    timestamp, err := strconv.ParseInt(timrstr, 10, 64)
    if err != nil {
        fmt.Println("err:", err)
        return
    }
    t := time.Unix(timestamp, 0)
    fmt.Println(t)
}

在这里插入图片描述

3. 时间的格式化

Go语言允许你按照特定的格式来格式化时间对象,或者将字符串按照指定的格式解析为时间对象。
time.Time 提供了 Format 方法来格式化时间。
func (t Time) Format(layout string) string

Go语言的时间格式化模板不是常见的Y-m-d H:M:S,而是使用Go的诞生时间2006年1月2日 15点04分作为记忆口诀。

格式化模板使用Go的出生时间“2006年1月2日 15时04分05秒”(记忆口诀为“2006 1 2 3 4 5”)。

模板必须用这个时间,否则格式化不了

格式化时间

package main  
  
import (  
    "fmt"  
    "time"  
)  
  
func main() {  
    // 时间格式化 2023-02-23 20:43:49
    // 格式化模板: yyyy-MM-dd HH:mm:ss
    // Go语言诞生的时间作为格式化模板:2006年1月2号下午3点4分5秒
    // Go语言格式化时间的代码:2006-01-02 15:04:05  (记忆方式:2006 12 345)
    // 固定的:"2006-01-02 15:04:05"
    now := time.Now()

    // 24小时制
    fmt.Println(now.Format("2006-01-02 15:04:05")) //2024-09-29 16:34:52

    // 12小时制
    fmt.Println(now.Format("2006-01-02 03:04:05 PM")) //2024-09-29 04:34:52 PM

    // 自定义格式
    fmt.Println(now.Format("Jan 2, 2006 at 3:04pm (MST)")) // Sep 29, 2024 at 4:34pm (CST)
    fmt.Println(now.Format("2006/01/02 15:04"))            // 2024/09/29 16:34
    fmt.Println(now.Format("15:04 2006/01/02"))            // 16:34 2024/09/29
    fmt.Println(now.Format("2006/01/02"))                  // 2024/09/29


}

在这里插入图片描述

4. 解析时间字符串

time.Parse 和 time.ParseInLocation 函数可以将符合特定格式的字符串解析为 time.Time 对象。
Parse函数默认使用本地时区,而ParseInLocation允许指定时区。

4.1 基本解析

func Parse(layout, value string) (Time, error)

package main  
  
import (  
    "fmt"  
    "time"  
)  
  
func main() {  

    const layout = "2006-01-02 15:04:05"   //模板时间必须是这个
        // 假设这是需要解析的时间字符串  

    const timeStr = "2023-09-10 12:34:56"  
  
    t, err := time.Parse(layout, timeStr)  
    if err != nil {  
        fmt.Println("Error parsing time:", err)  
        return  
    }  
    fmt.Println("Parsed time:", t)  
}

在这里插入图片描述

加入我们模板时间用错,解析报错

在这里插入图片描述

4.2 带时区的解析

如果时间字符串中包含时区信息,可以使用 time.ParseInLocation 进行解析,并指定时区。
加载时区
func LoadLocation(name string) (*Location, error)

package main  
  
import (  
    "fmt"  
    "time"  
)  
  
func main() {  
    // 假设这是需要解析的时间字符串,包含时区信息  
    const layout = "2006-01-02 15:04:05 MST"  
    const timeStr = "2023-09-10 12:34:56 CST"  
  
    // 加载时区  
    loc, err := time.LoadLocation("Asia/Shanghai")  
    if err != nil {  
        fmt.Println("Error loading location:", err)  
        return  
    }  
  
    t, err := time.ParseInLocation(layout, timeStr, loc)  
    if err != nil {  
        fmt.Println("Error parsing time:", err)  
        return  
    }  
    fmt.Println("Parsed time with location:", t)  
}

在这里插入图片描述

5. 时间的计算

time 包提供了丰富的函数和方法来支持时间的计算,如时间的加减、时间间隔的计算等。

5.1 时间的加减

使用 time.Time 的 Add 方法可以在原有时间的基础上加上或减去一定的时间间隔。

package main  
  
import (  
    "fmt"  
    "time"  
)  
  
func main() {  
    now := time.Now()  
    // 加上一小时  
    oneHourLater := now.Add(time.Hour)  
    fmt.Println("One hour later:", oneHourLater)  
  
    // 减去一天  
    oneDayAgo := now.Add(-24 * time.Hour)  
    fmt.Println("One day ago:", oneDayAgo)  
}

在这里插入图片描述

5.2 时间间隔的计算

time.Duration 类型代表两个时间点之间经过的时间,以纳秒为单位。可以使用 time.Time 的 Sub 方法来计算两个时间点之间的时间间隔。

package main  
  
import (  
    "fmt"  
    "time"  
)  
  
func main() {  
    start := time.Now()  
    // 假设这里有一些耗时操作  
    time.Sleep(2 * time.Second)  
    end := time.Now()  
  
    duration := end.Sub(start)  
    fmt.Println("Duration:", duration)  
    
        // 转换为不同单位
    hours := duration.Hours()
    minutes := duration.Minutes()
    seconds := duration.Seconds()
    fmt.Printf("Duration in hours: %v\n", hours)
    fmt.Printf("Duration in minutes: %v\n", minutes)
    fmt.Printf("Duration in seconds: %v\n", seconds)
}

在这里插入图片描述

使用time.ParseDuration解析时间间隔字符串

d, _ := time.ParseDuration("1.2h")
fmt.Println("Parsed Duration:", d)

在这里插入图片描述

5.3 判断时间先后

package main  
  
import (  
    "fmt"  
    "time"  
)  
  
func main() {  
    t1 := time.Now()
    t2 := t1.Add(time.Hour)
    fmt.Println(t1)
    fmt.Println(t2)

    // 判断时间先后
    fmt.Println(t1.Before(t2)) // true
    fmt.Println(t1.After(t2))  // false
    fmt.Println(t1.Equal(t2))  // false


}

在这里插入图片描述

6. 时区处理

6.1 时区表示

在Go语言中,时区通过time.Location类型表示。可以使用time.LoadLocation函数加载一个时区,或者使用time.FixedZone函数创建一个固定偏移量的时区。

package main  
  
import (  
    "fmt"  
    "time"  
)  
  
func main() {  
    // 加载时区  
    loc, err := time.LoadLocation("Asia/Shanghai")  
    if err != nil {  
        fmt.Println("Error loading location:", err)  
        return  
    }  
    fmt.Println(loc)  
  
    // 创建固定偏移量的时区  
    beijing := time.FixedZone("Beijing Time", 8*3600)  
    fmt.Println(beijing)  
}

在这里插入图片描述

6.2 时区转换

在处理跨时区的时间时,可能需要将时间从一个时区转换到另一个时区。这通常涉及到创建两个时间对象,一个代表原始时间,另一个代表转换后的时间,并指定不同的时区。

package main  
  
import (  
    "fmt"  
    "time"  
)  
  
func main() {  
    // 原始时间(UTC)  
    utcTime := time.Date(2023, 9, 10, 12, 0, 0, 0, time.UTC)  
    fmt.Println("UTC Time:", utcTime)  
  
    // 转换为北京时间  
    beijingLoc, err := time.LoadLocation("Asia/Shanghai")  
    if err != nil {  
        fmt.Println("Error loading location:", err)  
        return  
    }  
    beijingTime := utcTime.In(beijingLoc)  
    fmt.Println("Beijing Time:", beijingTime)  
}

在这里插入图片描述

7. 总结

Go 语言中的 time 包提供了强大的时间处理功能,包括时间的表示、计算、格式化和解析等。通过本文的详细介绍和实际应用案例,相信读者已经对 Go 语言中的时间处理有了更深入的了解。在实际编程中,合理利用 time 包的功能,可以大大简化时间相关的操作,提高编程效率。

以上就是Go语言中时间time相关处理方法详解的详细内容,更多关于Go时间time相关处理方法的资料请关注脚本之家其它相关文章!

相关文章

  • 如何使用Goland IDE go mod 方式构建项目

    如何使用Goland IDE go mod 方式构建项目

    这篇文章主要介绍了如何使用Goland IDE go mod 方式构建项目,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • 深入理解Go设计模式之代理模式

    深入理解Go设计模式之代理模式

    代理模式是一种结构型设计模式, 其中代理控制着对于原对象的访问, 并允许在将请求提交给原对象的前后进行一些处理,从而增强原对象的逻辑处理,这篇文章主要来学习一下代理模式的构成和用法,需要的朋友可以参考下
    2023-05-05
  • 一文带大家搞懂Go语言中的迭代器

    一文带大家搞懂Go语言中的迭代器

    迭代器是使用户可在容器对象上遍访的对象,设计人员使用此接口无需关心容器对象的内存分配的实现细节,本文主要为大家详细介绍一下Go语言中的迭代器的实现,需要的可以了解下
    2025-02-02
  • Golang 实现插入排序的方法示例(2种)

    Golang 实现插入排序的方法示例(2种)

    这篇文章主要介绍了Golang 实现插入排序的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • golang中new与make的区别讲解

    golang中new与make的区别讲解

    new只能开辟单个空间,不能为引用类型开辟多个空间,并且new是对类型进行内存的开辟,返回一个指向该内存空间的指针类型,如果使用new去初始化引用数据类型,不是很合适(当然,new一个对象还是可以的),因此就需要用到另一个内置函数make,需要的朋友可以参考下
    2023-01-01
  • 关于golang中map使用的几点注意事项总结(强烈推荐!)

    关于golang中map使用的几点注意事项总结(强烈推荐!)

    map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用,下面这篇文章主要给大家介绍了关于golang中map使用的几点注意事项,需要的朋友可以参考下
    2023-01-01
  • go 代码格式化和风格开发者指南

    go 代码格式化和风格开发者指南

    这篇文章主要为大家介绍了go 代码格式化和风格开发者指南,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • go语言通过zlib压缩数据的方法

    go语言通过zlib压缩数据的方法

    这篇文章主要介绍了go语言通过zlib压缩数据的方法,实例分析了Go语言中zlib的使用技巧,需要的朋友可以参考下
    2015-03-03
  • Go语言的匿名字段实现组合复用实例探究

    Go语言的匿名字段实现组合复用实例探究

    这篇文章主要为大家介绍了Go语言的匿名字段实现组合复用实例探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Golang基于Vault实现敏感数据加解密

    Golang基于Vault实现敏感数据加解密

    数据加密是主要的数据安全防护技术之一,敏感数据应该加密存储在数据库中,降低泄露风险,本文将介绍一下利用Vault实现敏感数据加解密的方法,需要的可以参考一下
    2023-07-07

最新评论