【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语言] 函数详解:库函数与自定义函数
文章目录 函数的概念库函数和自定义函数库函数使用库函数示例常用库函数及头文件 自定义函数自定义函数的基本结构示例:实现两个数的求和函数自定义函数的好处 函数的返回值有返回值的函数无返回值的函数 函数的声明与调用声明函数在另一个文件中调用函数示例&#…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
Python爬虫实战:研究Restkit库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …...
虚幻基础:角色旋转
能帮到你的话,就给个赞吧 😘 文章目录 移动组件使用控制器所需旋转:组件 使用 控制器旋转将旋转朝向运动:组件 使用 移动方向旋转 控制器旋转和移动旋转 缺点移动旋转:必须移动才能旋转,不移动不旋转控制器…...
Yii2项目自动向GitLab上报Bug
Yii2 项目自动上报Bug 原理 yii2在程序报错时, 会执行指定action, 通过重写ErrorAction, 实现Bug自动提交至GitLab的issue 步骤 配置SiteController中的actions方法 public function actions(){return [error > [class > app\helpers\web\ErrorAction,],];}重写Error…...