一文带你掌握Go语言中的时间处理操作

 更新时间:2026年04月09日 09:53:12   作者:王码码2035哦  
这篇文章主要为大家详细介绍了Go语言中的时间处理操作的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解下

1. 时间类型

Go语言的time包提供了时间处理的核心功能。主要类型包括:

  • time.Time:表示一个具体的时间点
  • time.Duration:表示一段时间间隔
  • time.Location:表示时区

2. 基本时间操作

2.1 获取当前时间

package main

import (
	"fmt"
	"time"
)

func main() {
	// 获取当前时间
	now := time.Now()
	fmt.Println("Current time:", now)
	
	// 获取UTC时间
	utc := time.Now().UTC()
	fmt.Println("UTC time:", utc)
}

2.2 时间格式化

package main

import (
	"fmt"
	"time"
)

func main() {
	now := time.Now()
	
	// 格式化时间
	fmt.Println("RFC3339:", now.Format(time.RFC3339))
	fmt.Println("Custom:", now.Format("2006-01-02 15:04:05"))
}

2.3 时间解析

package main
import (
	"fmt"
	"time"
)
func main() {
	// 解析时间字符串
	t, err := time.Parse("2006-01-02", "2023-12-25")
	if err != nil {
		fmt.Println("Error parsing time:", err)
		return
	}
	fmt.Println("Parsed time:", t)
}

3. 时间计算

3.1 时间加减

package main

import (
	"fmt"
	"time"
)

func main() {
	now := time.Now()
	
	// 加1小时
	oneHourLater := now.Add(time.Hour)
	fmt.Println("One hour later:", oneHourLater)
	
	// 减30分钟
	thirtyMinutesAgo := now.Add(-30 * time.Minute)
	fmt.Println("Thirty minutes ago:", thirtyMinutesAgo)
}

3.2 时间比较

package main

import (
	"fmt"
	"time"
)

func main() {
	now := time.Now()
	later := now.Add(time.Hour)
	
	// 比较时间
	fmt.Println("now before later:", now.Before(later))
	fmt.Println("now after later:", now.After(later))
	fmt.Println("now equal later:", now.Equal(later))
}

3.3 时间差

package main

import (
	"fmt"
	"time"
)

func main() {
	start := time.Now()
	
	// 模拟耗时操作
	time.Sleep(1 * time.Second)
	
	end := time.Now()
	duration := end.Sub(start)
	fmt.Println("Duration:", duration)
	fmt.Println("Seconds:", duration.Seconds())
}

4. 时区处理

package main

import (
	"fmt"
	"time"
)

func main() {
	// 获取本地时区
	loc, err := time.LoadLocation("Local")
	if err != nil {
		fmt.Println("Error loading location:", err)
		return
	}
	
	// 获取特定时区
	nyc, err := time.LoadLocation("America/New_York")
	if err != nil {
		fmt.Println("Error loading NYC location:", err)
		return
	}
	
	// 创建带时区的时间
	t := time.Date(2023, 12, 25, 10, 0, 0, 0, nyc)
	fmt.Println("NYC time:", t)
	
	// 转换时区
	localTime := t.In(loc)
	fmt.Println("Local time:", localTime)
}

5. 定时器

5.1 一次性定时器

package main

import (
	"fmt"
	"time"
)

func main() {
	// 创建定时器
	timer := time.NewTimer(2 * time.Second)
	
	fmt.Println("Waiting for timer...")
	<-timer.C
	fmt.Println("Timer fired!")
}

5.2 周期性定时器

package main

import (
	"fmt"
	"time"
)

func main() {
	// 创建周期性定时器
	ticker := time.NewTicker(1 * time.Second)
	defer ticker.Stop()
	
	go func() {
		for t := range ticker.C {
			fmt.Println("Tick at", t)
		}
	}()
	
	// 等待一段时间
	time.Sleep(5 * time.Second)
	fmt.Println("Done")
}

6. 实战应用

6.1 时间戳转换

package main

import (
	"fmt"
	"time"
)

func main() {
	// 时间转时间戳
	now := time.Now()
	timestamp := now.Unix()
	fmt.Println("Timestamp:", timestamp)
	
	// 时间戳转时间
	t := time.Unix(timestamp, 0)
	fmt.Println("Time from timestamp:", t)
}

6.2 格式化时间输出

package main

import (
	"fmt"
	"time"
)

func formatTime(t time.Time) string {
	return t.Format("2006-01-02 15:04:05")
}

func main() {
	now := time.Now()
	fmt.Println("Formatted time:", formatTime(now))
}

6.3 计算时间差

package main

import (
	"fmt"
	"time"
)

func timeSince(t time.Time) string {
	duration := time.Since(t)
	
	switch {
	case duration < time.Minute:
		return fmt.Sprintf("%d秒前", int(duration.Seconds()))
	case duration < time.Hour:
		return fmt.Sprintf("%d分钟前", int(duration.Minutes()))
	case duration < 24*time.Hour:
		return fmt.Sprintf("%d小时前", int(duration.Hours()))
	default:
		return fmt.Sprintf("%d天前", int(duration.Hours()/24))
	}
}

func main() {
	past := time.Now().Add(-2 * time.Hour)
	fmt.Println("Time since:", timeSince(past))
}

7. 总结

  • 使用time.Now()获取当前时间
  • 使用time.Format()格式化时间
  • 使用time.Parse()解析时间字符串
  • 使用Add()Sub()进行时间计算
  • 使用Before(), After(), Equal()比较时间
  • 使用LoadLocation()处理时区
  • 使用NewTimer()NewTicker()创建定时器
  • 掌握时间戳与时间对象的相互转换

到此这篇关于一文带你掌握Go语言中的时间处理操作的文章就介绍到这了,更多相关Go语言时间处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言中的init函数特点及用法详解

    Go语言中的init函数特点及用法详解

    在Go语言中,init()函数是一种特殊的函数,用于在程序启动时自动执行一次。它的存在为我们提供了一种机制,可以在程序启动时进行一些必要的初始化操作,为程序的正常运行做好准备,在这篇文章中,我们将详细探讨init()函数的特点、用途和注意事项
    2023-06-06
  • Go语言实现字符串搜索算法Boyer-Moore

    Go语言实现字符串搜索算法Boyer-Moore

    Boyer-Moore 算法是一种非常高效的字符串搜索算法,被广泛的应用于多种字符串搜索场景,下面我们就来学习一下如何利用Go语言实现这一字符串搜索算法吧
    2023-11-11
  • Go语言基于标准库encoding/json进行json文件处理详解

    Go语言基于标准库encoding/json进行json文件处理详解

    Go语言提供了强大的内置支持来处理JSON数据,主要通过标准库encoding/json实现,下面小编就和大家详细介绍一下使用encoding/json操作Json文件的具体实现方法吧
    2025-10-10
  • 使用go实现适配器模式

    使用go实现适配器模式

    这篇文章主要介绍了使用go实现适配器模式,这个模式就是用来做适配的,它将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作,需要的朋友可以参考下
    2021-11-11
  • 源码分析Go语言中gofmt实现原理

    源码分析Go语言中gofmt实现原理

    gofmt 是 Go 语言官方提供的一个工具,用于自动格式化 Go 源代码,使其符合 Go 语言的官方编码风格,本文给大家源码详细分析了Go语言中gofmt实现原理,并通过图文和代码讲解的非常详细,需要的朋友可以参考下
    2024-03-03
  • 使用Go语言创建静态文件服务器问题

    使用Go语言创建静态文件服务器问题

    这篇文章主要介绍了使用Go语言创建静态文件服务器,本文通过试了代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • Go使用TimerController解决timer过多的问题

    Go使用TimerController解决timer过多的问题

    多路复用,实际上Go底层也是一种多路复用的思想去实现的timer,但是它是底层的timer,我们需要解决的问题就过多的timer问题!本文给大家介绍了Go使用TimerController解决timer过多的问题,需要的朋友可以参考下
    2024-12-12
  • golang json.Marshal 特殊html字符被转义的解决方法

    golang json.Marshal 特殊html字符被转义的解决方法

    今天小编就为大家分享一篇golang json.Marshal 特殊html字符被转义的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • Linux系统下Go语言开发环境搭建

    Linux系统下Go语言开发环境搭建

    这篇文章主要介绍了Linux系统下Go开发环境搭建,需要的朋友可以参考下
    2022-04-04
  • GO语言make()分配用法实例

    GO语言make()分配用法实例

    这篇文章主要介绍了GO语言make()分配用法,实例分析了make()的功能及使用技巧,需要的朋友可以参考下
    2015-02-02

最新评论