【Golang】Go 语言中的 time 包详解:全面掌握时间处理与应用
在 Go 语言中,time
包提供了强大的时间处理功能,适用于各种场景:获取当前时间、格式化和解析时间、计算时间间隔、设置定时器、处理超时等。在开发过程中,熟练掌握 time
包能够帮助我们轻松处理时间相关的操作,尤其是定时任务、超时控制等非常常见的功能。
文章目录
- 一、`time.Time` 类型与当前时间获取
- 1.1 获取当前时间
- 1.2 `time.Time` 类型的组件
- 1.3 UNIX 时间戳
- 二、时间格式化与解析
- 2.1 时间格式化
- 常见时间格式化布局
- 2.2 时间解析
- 三、时间间隔与时间操作
- 3.1 时间间隔的计算
- 3.2 时间加减操作
- 3.3 时间差计算
- 四、定时器与超时处理
- 4.1 `time.Sleep`:延时执行
- 4.2 `time.After`:延时后触发
- 4.3 `time.Ticker`:周期性触发
- 4.4 `time.Timer`:一次性定时器
- 五、时区与时间转换
- 六、`time`包的其他常用功能
- 6.1 随机时间生成
- 6.2 测量代码执行时间
一、time.Time
类型与当前时间获取
time.Time
是 Go 中表示时间的核心类型,它封装了一个时间点的年、月、日、时、分、秒、纳秒等信息。
1.1 获取当前时间
要获取当前时间,我们可以使用 time.Now()
函数,该函数返回一个 time.Time
类型的对象,表示当前系统时间。
package mainimport ("fmt""time"
)func main() {currentTime := time.Now()fmt.Println("当前时间:", currentTime)
}
这个例子会输出当前时间,包括日期、时间和时区:
当前时间: 2024-10-11 14:45:02.123456789 +0800 CST m=+0.000000001
1.2 time.Time
类型的组件
time.Time
对象内部包含了许多时间组件,你可以通过调用特定的方法来获取它们:
fmt.Println("年:", currentTime.Year())
fmt.Println("月:", currentTime.Month())
fmt.Println("日:", currentTime.Day())
fmt.Println("小时:", currentTime.Hour())
fmt.Println("分钟:", currentTime.Minute())
fmt.Println("秒:", currentTime.Second())
fmt.Println("纳秒:", currentTime.Nanosecond())
fmt.Println("星期几:", currentTime.Weekday())
这些方法分别返回当前时间的年、月、日、小时等信息。例如:
年: 2024
月: October
日: 11
小时: 14
分钟: 45
秒: 2
纳秒: 123456789
星期几: Friday
1.3 UNIX 时间戳
time.Time
可以通过 Unix()
和 UnixNano()
方法转换为 UNIX 时间戳。UNIX 时间戳表示自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数或纳秒数。
fmt.Println("Unix 时间戳(秒):", currentTime.Unix())
fmt.Println("Unix 时间戳(纳秒):", currentTime.UnixNano())
二、时间格式化与解析
在实际开发中,我们经常需要将时间以特定的格式转换为字符串,或者将字符串解析为 time.Time
对象。Go 语言的 time
包使用一组固定的时间布局来完成这些操作。
2.1 时间格式化
在 Go 中,时间格式化通过 Format()
方法实现。time
包使用的是一种独特的布局字符串,而不是常见的 YYYY-MM-DD
之类的占位符。
Go 使用日期 2006-01-02 15:04:05
作为参考时间,按照该布局中的特定数字代表时间组件:
2006
:年份01
:月份02
:日期15
:小时(24 小时制)04
:分钟05
:秒
例如:
formattedTime := currentTime.Format("2006-01-02 15:04:05")
fmt.Println("格式化后的时间:", formattedTime)
常见时间格式化布局
你可以根据自己的需求定义不同的时间格式:
2006-01-02
:标准日期格式(年-月-日)15:04:05
:24 小时制的时间格式03:04:05 PM
:12 小时制的时间格式,带 AM/PM 标志
fmt.Println(currentTime.Format("2006-01-02")) // 2024-10-11
fmt.Println(currentTime.Format("15:04:05")) // 14:45:02
fmt.Println(currentTime.Format("03:04:05 PM")) // 02:45:02 PM
2.2 时间解析
time.Parse()
方法可以将一个字符串解析为 time.Time
对象,解析时你需要提供相应的布局字符串来匹配时间格式。
timeStr := "2024-10-11 14:45:02"
parsedTime, err := time.Parse("2006-01-02 15:04:05", timeStr)
if err != nil {fmt.Println("解析时间出错:", err)
} else {fmt.Println("解析后的时间:", parsedTime)
}
输出结果为解析后的 time.Time
对象:
解析后的时间: 2024-10-11 14:45:02 +0000 UTC
三、时间间隔与时间操作
在 Go 语言中,time.Duration
用于表示两个时间点之间的时间间隔。Duration
的单位是纳秒,可以用来表示从纳秒到小时之间的时间段。
3.1 时间间隔的计算
通过 time.Since()
可以计算某个时间点距离当前的时间间隔,返回的是一个 time.Duration
对象。
startTime := time.Now()
time.Sleep(2 * time.Second) // 模拟耗时操作
elapsed := time.Since(startTime)
fmt.Println("操作耗时:", elapsed)
输出的结果类似:
操作耗时: 2s
3.2 时间加减操作
可以通过 Add()
方法对时间进行加减操作,例如加上或减去一定的时间间隔。
nextWeek := currentTime.Add(7 * 24 * time.Hour)
fmt.Println("一周后的时间:", nextWeek)yesterday := currentTime.Add(-24 * time.Hour)
fmt.Println("昨天的时间:", yesterday)
3.3 时间差计算
通过 Sub()
方法,可以计算两个时间点之间的时间差。
startTime := time.Date(2024, 10, 1, 9, 0, 0, 0, time.Local)
duration := currentTime.Sub(startTime)
fmt.Println("时间差:", duration)
该方法返回两个 time.Time
对象之间的 Duration
,可以进一步转换为天数、小时数等。
fmt.Println("时间差(小时):", duration.Hours())
fmt.Println("时间差(分钟):", duration.Minutes())
fmt.Println("时间差(秒):", duration.Seconds())
fmt.Println("时间差(纳秒):", duration.Nanoseconds())
四、定时器与超时处理
time
包提供了两种常用的定时功能:Ticker
和 Timer
。
4.1 time.Sleep
:延时执行
最简单的定时操作是 time.Sleep()
,它会让当前 goroutine 暂停指定的时间。
fmt.Println("延时 3 秒执行")
time.Sleep(3 * time.Second)
fmt.Println("延时结束")
4.2 time.After
:延时后触发
time.After()
返回一个通道,指定时间之后会向该通道发送当前时间。常用于超时控制。
select {
case <-time.After(2 * time.Second):fmt.Println("2 秒后执行")
}
4.3 time.Ticker
:周期性触发
Ticker
是一种定时器,它会按照指定的时间间隔周期性地触发事件。Ticker
通过 NewTicker()
创建,返回一个通道,通道会定期发送时间信号。
ticker := time.NewTicker(1 * time.Second)
go func() {for t := range ticker.C {fmt.Println("每秒触发一次,当前时间:", t)}
}()
time.Sleep(5 * time.Second)
ticker.Stop()
fmt.Println("Ticker 已停止")
4.4 time.Timer
:一次性定时器
Timer
是一种一次性触发的定时器,指定时间后触发一次。
timer := time.NewTimer(3 * time.Second)
fmt.Println("等待 3 秒")
<-timer.C
fmt.Println("Timer 触发")
五、时区与时间转换
time
包支持不同的时区处理,通过 time.LoadLocation()
可以加载不同的时区,并将时间转换为该时区的时间。
loc, _ := time.LoadLocation("America/New_York")
nyTime := currentTime.In(loc)
fmt.Println("纽约时间:", nyTime)
六、time
包的其他常用功能
6.1 随机时间生成
通过随机生成时间,可以模拟一些时间上的变化。
import "math/rand"randomDuration := time.Duration(rand.Intn(1000)) * time.Millisecond
randomTime := currentTime.Add(randomDuration)
fmt.Println("随机时间:", randomTime)
6.2 测量代码执行时间
通过记录操作开始和结束时间,可以很方便地计算代码执行时间。
start := time.Now()
// 执行一些代码
elapsed := time.Since(start)
fmt.Println("代码执行时间:", elapsed)
通过上面的内容,详细介绍了 Go 语言中的 time
包常见的用法以及对应的实例。time
包不仅仅可以处理时间的获取、格式化、解析,还涉及时间的加减、间隔计算、定时器等功能。希望通过这些详细的讲解,能够帮助大家在开发中更好地应用 time
包,轻松应对时间处理相关的场景。
相关文章:

【Golang】Go 语言中的 time 包详解:全面掌握时间处理与应用
在 Go 语言中,time 包提供了强大的时间处理功能,适用于各种场景:获取当前时间、格式化和解析时间、计算时间间隔、设置定时器、处理超时等。在开发过程中,熟练掌握 time 包能够帮助我们轻松处理时间相关的操作,尤其是定…...

MySQL联合索引、索引下推Demo
1.联合索引 测试SQL语句如下:表test中共有4个字段(id, a, b, c),id为主键 drop table test;#建表 create table test(id bigint primary key auto_increment,a int,b int,c int )#表中插入数据 insert into test(a, b, c) values(1,2,3),(2,3,4),(4,5,…...
linux上复制命令cp的常见用法-ubuntu
在Ubuntu中,cp命令是用于复制文件和目录的基本命令。以下是cp命令的常见用法和选项: 基本语法 cp [选项] 源文件 目标文件常用选项 -r 或 -R:递归复制目录及其内容。-p:保留源文件的属性(如权限、所有者、时间戳&am…...
R语言绘制气泡图
气泡图是一种数据可视化图表。它通常在二维或三维空间中展示数据。两个变量决定气泡在平面或空间中的位置,第三个变量则以气泡大小呈现。能直观反映三个变量间关系,帮助用户快速理解数据特征和趋势,在数据分析和展示中广泛应用。 0x01 使用s…...
c++ sparsetable 模版
闭区间查询 支持 区间最大 区间最小 区间和 区间最大下标 区间最小下标 #include <bits/stdc.h> using namespace std;#ifndef NO_UNIQUE_ADDRESS # ifdef __has_cpp_attribute # if __has_cpp_attribute(no_unique_address) # define NO_UNIQUE_…...
创建线程池和封装锁
封装一个锁 1.封装一个Mutex class Mutex{public:Mutex(pthread_mutex_t * lock):_lock(lock){}void Lock(){pthread_mutex_lock(_lock);}void unLock(){pthread_mutex_unlock(_lock);}~Mutex(){}private:pthread_mutex_t *_lock; };2.封装一个LockGuard class LockGuard{pub…...

易图讯军用VR三维电子沙盘系统
深圳易图讯军用VR三维电子沙盘系统是一种集成了虚拟现实(VR)技术、三维建模技术、大数据分析、实时动态更新以及高度安全可靠的综合性军事指挥平台。该系统通过高精度三维模型真实再现战场环境,为指挥员提供沉浸式体验和交互操作的可能性&…...

LeetCode讲解篇之70. 爬楼梯
文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 爬楼梯有一个规律,爬到第n层楼梯的方法种数 爬到第n - 1层楼梯的方法种数 爬到第n - 1层楼梯的方法种数 也就是我们爬到第n层楼梯其实是从第n - 1层楼梯向上爬1层或者是n - 2层楼梯向上爬2层转换来…...

论文写作不再难,论文初稿快速成型法!
撰写论文是每个学者的必修课,我非常明白撰写论文的不易。撰写过程中会遇到各种困扰,如思路不清晰、论证不充分、语言表达不准确等。在这里以我的经验分享给大家一个能快速完成论文初稿的秘诀“AI导师写作”,希望能帮助还在为论文发愁的你。 …...
linux系统,监控进程运行状态并自动重启崩溃后的进程的多种方法
系统进程运行异常崩溃后,自动重启的方法 有的公司,会写monitor守护进程,监视各个进程的运行状态,异常时,自动重启,但是这种,通过一个进程 监护一个进程的做法,不太完美,…...

【JavaEE初阶】深入理解不同锁的意义,synchronized的加锁过程理解以及CAS的原子性实现(面试经典题);
前言 🌟🌟本期讲解关于锁的相关知识了解,这里涉及到高频面试题哦~~~ 🌈上期博客在这里:【JavaEE初阶】深入理解线程池的概念以及Java标准库提供的方法参数分析-CSDN博客 🌈感兴趣的小伙伴看一看小编主页&am…...

详解Redis分布式锁在SpringBoot的@Async方法中没锁住的坑
背景 Redis分布式锁很有用处,在秒杀、抢购、订单、限流特别是一些用到异步分布式并行处理任务时频繁的用到,可以说它是一个BS架构的应用中最高频使用的技术之一。 但是我们经常会碰到这样的一个问题,那就是我们都按照标准做了但有时运行着、…...

怎么做接口自动化测试
在分层测试的“金字塔”模型中,接口测试属于第二层服务集成测试范畴。相比UI层(主要是WEB或APP)自动化测试而言,接口自动化测试收益更大,且容易实现,维护成本低,有着更高的投入产出比࿰…...

网络编程(18)——使用asio协程实现并发服务器
十八、day18 到目前为止,我们以及学习了单线程同步/异步服务器、多线程IOServicePool和多线程IOThreadPool模型,今天学习如何通过asio协程实现并发服务器。 并发服务器有以下几种好处: 协程比线程更轻量,创建和销毁协程的开销较…...

Koa2项目实战2(路由管理、项目结构优化)
添加路由(处理不同的URL请求) 路由:根据不同的URL,调用对应的处理函数。 每一个接口服务,最核心的功能是:根据不同的URL请求,返回不同的数据。也就是调用不同的接口返回不同的数据。 在 Node…...

决战Linux操作系统
前言: 你是否也曾经为Linux所困扰过,在网上找的资料零零散散,是否学完Linux后还是懵懵懂懂,别怕,这篇博客是博主精心为你准备的,现在,就让我们一起来走进Linux的世界,决战Linux&…...
OceanBase 3.2.2 数据库问题处理记录
只记录OceanBase 数据库与OCP的异常处理,其它组件暂时不写录。 一、问题1: 说明:OMS 出现异常,无法访问(OB无法访问) OB数据库架构:1:1:1 原因:某一台OBserver因为内存问题,被服务器直接kill掉…...

HCIP--以太网交换安全(二)端口安全
端口安全 一、端口安全概述 1.1、端口安全概述:端口安全是一种网络设备防护措施,通过将接口学习的MAC地址设为安全地址防止非法用户通信。 1.2、端口安全原理: 类型 定义 特点 安全动态MAC地址 使能端口而未是能Stichy MAC功能是转换的…...

在 Windows 11 安卓子系统中安装 APK 的操作指南
这个软件好像不可以在纯android系统中使用(不知道是缺了什么),其他对于android的虚拟机要不缺少必要功能组件,要不性能过于低下。本方法致力于在带有谷歌框架WSA中运行该APK 在 Windows 11 安卓子系统中安装 APK 的操作指南 本指…...

[C语言] 函数详解:库函数与自定义函数
文章目录 函数的概念库函数和自定义函数库函数使用库函数示例常用库函数及头文件 自定义函数自定义函数的基本结构示例:实现两个数的求和函数自定义函数的好处 函数的返回值有返回值的函数无返回值的函数 函数的声明与调用声明函数在另一个文件中调用函数示例&#…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...