Go 语言标准库中time模块详细功能介绍与示例

news/2025/4/1 1:41:25/

以下是 Go 语言 time 模块的详细说明及示例,涵盖时间操作、定时器、时区处理等核心功能:


一、时间基础操作

1. 获取时间
// 当前本地时间
now := time.Now()
fmt.Println(now) // 2023-08-04 15:30:45.123456 +0800 CST// 构造指定时间
t := time.Date(2023, 8, 4, 12, 30, 0, 0, time.UTC)
fmt.Println(t) // 2023-08-04 12:30:00 +0000 UTC
2. 时间戳转换
// 获取秒级/毫秒级/纳秒级时间戳
sec := now.Unix()      // 1691134245
msec := now.UnixMilli()// 1691134245123
nsec := now.UnixNano() // 1691134245123456789// 时间戳转Time对象
t1 := time.Unix(sec, 0) // 2023-08-04 15:30:45 +0800 CST

二、时间格式化与解析

1. 标准格式化
// 格式化为字符串(固定布局)
fmt.Println(now.Format("2006-01-02 15:04:05")) // 2023-08-04 15:30:45
fmt.Println(now.Format(time.RFC3339))          // 2023-08-04T15:30:45+08:00// 解析时间字符串
t2, _ := time.Parse("2006-01-02", "2023-08-04")
fmt.Println(t2) // 2023-08-04 00:00:00 +0000 UTC
2. 时区处理
// 加载时区
loc, _ := time.LoadLocation("America/New_York")
nyTime := now.In(loc)
fmt.Println(nyTime) // 2023-08-04 03:30:45 -0400 EDT// 创建固定时区
fixedZone := time.FixedZone("CST", 8*3600)
t3 := time.Date(2023, 8, 4, 12, 0, 0, 0, fixedZone)

三、时间运算与比较

1. 时间加减
// 加1小时30分钟
t4 := now.Add(1*time.Hour + 30*time.Minute)// 计算时间差
duration := t4.Sub(now) // 1h30m0s// 使用时间常量
t5 := now.Add(24 * time.Hour) // 加1天
2. 时间比较
// 判断时间先后
isAfter := now.After(t3)  // true
isBefore := now.Before(t3) // false// 计算相对时间
time.Since(t3)  // 已过时间
time.Until(t3)  // 剩余时间

四、定时器与周期任务

1. Timer(单次定时)
timer := time.NewTimer(2 * time.Second)
<-timer.C // 阻塞等待2秒
timer.Stop() // 取消未触发的定时器
2. Ticker(周期触发)
ticker := time.NewTicker(1 * time.Second)
defer ticker.Stop()for {select {case <-ticker.C:fmt.Println("每秒触发")case <-time.After(5 * time.Second):return // 5秒后退出}
}

五、其他实用方法

1. 睡眠控制
time.Sleep(100 * time.Millisecond) // 精确睡眠
2. 时间间隔计算
start := time.Now()
// 执行某些操作...
elapsed := time.Since(start) // 计算耗时
fmt.Printf("耗时: %v\n", elapsed)
3. 时间组成部分提取
year := now.Year()     // 2023
month := now.Month()   // August
day := now.Day()       // 4
hour := now.Hour()     // 15
minute := now.Minute() // 30
4. 时间周期判断
// 判断是否为周末
if now.Weekday() == time.Saturday || now.Weekday() == time.Sunday {fmt.Println("周末")
}

六、特殊时间处理

1. 截止时间控制
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()select {
case <-ctx.Done():fmt.Println("操作超时")
}
2. 解析持续时间字符串
duration, _ := time.ParseDuration("1h30m40s")
fmt.Println(duration.Hours()) // 1.511111111111111

七、时间格式布局对照表

布局字符含义示例
2006年(4位)2023
01月(前导零)08
02日(前导零)04
15时(24小时制)15
04分(前导零)05
05秒(前导零)06
.999毫秒(可重复).123
MST时区缩写CST
-0700时区偏移+0800

八、典型应用场景

1. 接口超时控制
func fetchData() (string, error) {// 模拟网络请求time.Sleep(2 * time.Second)return "data", nil
}func main() {ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)defer cancel()select {case result := <-asyncFetch(ctx):fmt.Println(result)case <-ctx.Done():fmt.Println("请求超时")}
}
2. 定时批处理
func batchJob() {ticker := time.NewTicker(5 * time.Minute)for range ticker.C {fmt.Println("执行定时任务:", time.Now().Format("15:04:05"))}
}

time 包是 Go 语言时间处理的基石,熟练掌握其 API 可以高效处理各种时间相关需求。建议结合官方文档 (pkg.go.dev/time) 进行深入理解。


http://www.ppmy.cn/news/1584000.html

相关文章

Linux 下安装和使用 Jupyter Notebook

Jupyter Notebook / Lab 是 Python 开发和数据分析中不可或缺的工具。为了避免环境污染&#xff0c;推荐使用虚拟环境方式安装并启动它。本教程将教你如何&#xff1a; 安装 Python、pip、venv使用虚拟环境安装 Jupyter设置登录密码启动并远程访问编写一个一键启动脚本&#x…

浏览器缓存资源 service worker

效果&#xff1a;访问 图片使用浏览器本地缓存 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>通过 Service Worker 拦截和处理网络请求&#xff08;可以实现网络资源的缓存&#xff…

【Leetcode 每日一题】2716. 最小化字符串长度

问题背景 给你一个下标从 0 0 0 开始的字符串 s s s&#xff0c;重复执行下述操作 任意 次&#xff1a; 在字符串中选出一个下标 i i i&#xff0c;并使 c c c 为字符串下标 i i i 处的字符。并在 i i i 左侧&#xff08;如果有&#xff09;和 右侧&#xff08;如果有&…

Yarn下载的一些心得

&#xff08;我在解决终端不能识别yarn作为命令在网上找了好久&#xff0c;写下一点自己的心得&#xff09; 首先使用 npm instal -g yarn 来下载yarn没有错&#xff0c;但是会遇见下面的问题。 1.如果你没有下载npm &#xff0c; 那么下载nodejs来得到npm, 2.如果你使用了命…

ADZS-ICE-2000和AD-ICE2000仿真器在线升级固件

作者的话 近期发现有些兄弟的ICE-2000仿真器链接DSP报错&#xff0c;然后test第四步不通过&#xff0c;我就拿我的仿真器也试了一下&#xff0c;发现ADI悄咪咪的在线升级仿真器固件&#xff0c;有些兄弟不会操作&#xff0c;就会导致仿真器升级失败&#xff0c;连不上目标板&a…

17--华为防火墙智能选路全解:网络世界的智能导航系统

华为防火墙智能选路全解&#xff1a;网络世界的智能导航系统 开篇故事&#xff1a;快递小哥的烦恼与网络世界的相似性 想象你是个快递站站长&#xff0c;每天要处理来自全国各地的包裹。突然某天遇到&#xff1a; &#x1f69a; 双11爆仓&#xff1a;如何把包裹最快送到客户手…

VMware Ubuntu 网络配置全攻略:从断网到畅通无阻

一、网络连接模式选择&#xff08;先搞懂原理&#xff09; VMware提供三种网络模式&#xff0c;就像手机的不同网络套餐&#xff1a; 模式适用场景特点类比NAT个人上网/新手首选虚拟机共享主机IP&#xff0c;能上网但隐身家用WiFi桥接服务器/需要被局域网访问虚拟机会获得独立…

MySQL 基础查询语句参考手册

一、基本查询操作 从表中选取特定列 sql -- 从 employees 表中选取 last_name 列 SELECT last_name FROM employees;-- 从 employees 表中选取 last_name、salary、email 列 SELECT last_name, salary, email FROM employees;获取表的全部列信息 sql -- 从 jobs 表中获取所有列…