当前位置: 首页 > news >正文

Go 的时间操作

Go 的时间操作

1. time 包

1.1. 时间类型

Go 语言中时间类型有两种:

  • time.Time:表示时间的类型,常见的有两种方式:
    • time.Now():获取当前的时间
    • time.Date():根据指定的年、月、日、时、分、秒、纳秒等创建时间
  • time.Duration:表示两个时间点之间经过的时间,以纳秒为单位

1.2. 时间戳

时间戳是自 1970 年 1 月 1 日(08:00:00GMT)至当前时间的总毫秒数。它也被称为 Unix 时间戳(UnixTimestamp)。

1.3. 时间间隔

time.Duration 是 time 包定义的一个类型,它代表两个时间点之间经过的时间,以纳秒为单位。time.Duration 表示一段时间间隔,可表示的最长时间段大约 290 年。

1.4. 时间操作

Go 语言中时间操作主要有两种:

  • 获取时间:time.Now()、time.Date()
  • 格式化时间:time.Format()、time.Parse()

2. 获取时间

2.1. 获取当前时间

Go 语言中通过 time.Now()函数获取当前时间,返回一个 time.Time 类型的本地时间。

func Now() Time
package mainimport ("fmt""time"
)func main() {now := time.Now() // 获取当前时间fmt.Printf("current time:%v\n", now)
}

2.2. 获取指定时间

time.Date()函数可以获取指定的时间,其参数分别是:年、月、日、时、分、秒、纳秒、时区。

func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time
package mainimport ("fmt""time"
)func main() {// 获取指定时间date := time.Date(2020, 1, 1, 0, 0, 0, 0, time.Local)fmt.Printf("date:%v\n", date)
}

3. 格式化时间

3.1. 时间类型转字符串

Go 语言中可以通过 time.Time 类型的 Format()函数对时间进行格式化,该函数的第一个参数是格式化的模板,模板里面的时间必须是 2006-01-02 15:04:05 这个时间,这个时间是固定的,不然就会出错,第二个参数是要格式化的时间。

func (t Time) Format(layout string) string
package mainimport ("fmt""time"
)func main() {now := time.Now() // 获取当前时间// 格式化的模板为Go的出生时间2006年1月2号15点04分 Mon Janfmt.Println(now.Format("2006-01-02 15:04:05.000 Mon Jan"))fmt.Println(now.Format("2006/01/02 15:04"))fmt.Println(now.Format("15:04 2006/01/02"))
}

3.2. 字符串转时间类型

Go 语言中可以通过 time.Parse()函数对字符串进行解析,生成对应的 time.Time 类型的时间。

func Parse(layout, value string) (Time, error)
package mainimport ("fmt""time"
)func main() {// 加载时区loc, _ := time.LoadLocation("Asia/Shanghai")// 按照指定时区和指定格式解析字符串时间timeObj, err := time.ParseInLocation("2006/01/02 15:04:05", "2020/01/01 00:00:00", loc)if err != nil {fmt.Printf("parse time failed, err:%v\n", err)return}fmt.Println(timeObj)
}

4. 时间常量

const (Nanosecond  Duration = 1Microsecond          = 1000 * NanosecondMillisecond          = 1000 * MicrosecondSecond               = 1000 * MillisecondMinute               = 60 * SecondHour                 = 60 * Minute
)

5. 时间操作

5.1. 获取时间戳

时间戳是自 1970 年 1 月 1 日(08:00:00GMT)至当前时间的总毫秒数。它也被称为 Unix 时间戳(UnixTimestamp)。

func (t Time) Unix() int64
package mainimport ("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)
}

5.2. 时间间隔

time.Duration 是 time 包定义的一个类型,它代表两个时间点之间经过的时间,以纳秒为单位。time.Duration 表示一段时间间隔,可表示的最长时间段大约 290 年。

const (Nanosecond  Duration = 1Microsecond          = 1000 * NanosecondMillisecond          = 1000 * MicrosecondSecond               = 1000 * MillisecondMinute               = 60 * SecondHour                 = 60 * Minute
)
package mainimport ("fmt""time"
)func main() {now := time.Now()// 程序执行到这里会暂停2秒time.Sleep(2 * time.Second)fmt.Println("2 seconds later")// 两个时间相减fmt.Printf("passed %v\n", time.Since(now))
}

5.3. 定时器

time.Timer 类型表示单次时间事件。当定时器到期时,当前时间会被发送给 C,除非定时器是被 AfterFunc 函数创建的。因此,如果程序持有定时器的唯一引用,当定时器触发时,它会被释放,并停止定时器。

func AfterFunc(d Duration, f func()) *Timer
package mainimport ("fmt""time"
)func main() {timer := time.Tick(time.Second) // 定义一个1秒间隔的定时器for t := range timer {fmt.Println(t) // 1秒钟执行一次}
}

5.4. 定时器

time.Ticker 类型代表一个间隔触发的时间事件,它会以一个间隔(例如,1 秒、1 分钟等)触发多次,发送一个事件给一个通道。

func Tick(d Duration) *Ticker
package mainimport ("fmt""time"
)func main() {ticker := time.NewTicker(time.Second) // 定义一个1秒间隔的定时器for t := range ticker.C {fmt.Println(t) // 1秒钟执行一次}
}

6. 时区

Go 语言中通过 LoadLocation()函数加载时区信息,它的参数是时区的名字。时区信息我们可以通过 time 包中的 LoadLocation(name string) (*Location, error)函数获取,它返回一个 Location 对象,然后我们就可以通过 LoadLocation()函数加载时区信息了。

func LoadLocation(name string) (*Location, error)
package mainimport ("fmt""time"
)func main() {// 加载时区loc, err := time.LoadLocation("Asia/Shanghai")if err != nil {fmt.Printf("load location failed, err:%v\n", err)return}// 按照指定时区和指定格式解析字符串时间timeObj, err := time.ParseInLocation("2006/01/02 15:04:05", "2020/01/01 00:00:00", loc)if err != nil {fmt.Printf("parse time failed, err:%v\n", err)return}fmt.Println(timeObj)
}

7. 时区转换

func (t Time) In(loc *Location) Time
package mainimport ("fmt""time"
)func main() {// 加载时区loc, _ := time.LoadLocation("Asia/Shanghai")// 按照指定时区和指定格式解析字符串时间timeObj, err := time.ParseInLocation("2006/01/02 15:04:05", "2020/01/01 00:00:00", loc)if err != nil {fmt.Printf("parse time failed, err:%v\n", err)return}fmt.Println(timeObj)// 按照东八区的时区和格式去解析字符串时间timeObj, err = time.Parse("2006/01/02 15:04:05", "2020/01/01 00:00:00")if err != nil {fmt.Printf("parse time failed, err:%v\n", err)return}fmt.Println(timeObj)// 将timeObj转换到指定时区newTime := timeObj.In(loc)fmt.Println(newTime)
}

相关文章:

Go 的时间操作

Go 的时间操作 1. time 包 1.1. 时间类型 Go 语言中时间类型有两种: time.Time:表示时间的类型,常见的有两种方式: time.Now():获取当前的时间time.Date():根据指定的年、月、日、时、分、秒、纳秒等创…...

ThreeJS进阶之矩阵变换

ThreeJS的矩阵变换 Three.js使用matrix编码3D变换 —— 平移(位置),旋转和缩放。Object3D的每个实例都有一个matrix,用于存储该对象的位置,旋转和比例。这里介绍如何更新对象的变换。 三维物体(Object3D) 这是Three.js中大部分对象的基类,提供了一系列的属性和方法来对…...

分布式锁概念

什么是分布式锁 方案一:SETNX EXPIRE 方案二:SETNX value值是(系统时间过期时间) 方案三:使用Lua脚本(包含SETNX EXPIRE两条指令) 方案四:SET的扩展命令(SET EX PX NX) 方案五…...

PMP课堂模拟题目及解析(第10期)

91. 在项目执行阶段,一名项目干系人要求项目经理加入一个新过程的优化。项目经理应该怎么做? A. 执行实施整体变更控制过程。 B. 与过程专家一起审查项目。 C. 将优化项目分配给团队。 D. 拒绝范围蔓延企图。 92. 项目经理要求团队提供对项目应急计…...

Arm微架构分析系列3——Arm的X计划

1. 引言 前文介绍了Arm公司近几年在移动处理器市场推出的Cortex-A系列处理器。Cortex-A系列处理器每年迭代,性能和能效不断提升,是一款非常成功的产品。但是,Arm并不满足于Cortex-A系列每年的架构小幅度升级,又推出了X计划&#x…...

Kubernetes(K8S)的基础概念

文章目录 一、Kubernetes介绍1、什么是Kubernetes?2、为什么要用K8S?3、k8s的特性 二、k8s集群架构与组件1、Master组件2、配置存储中心——etcd3、Worker Node 组件 三、k8s核心概念●Pod●Pod 控制器(五大控制器)●Label●Label选择器(Label selector )●Service…...

【Linux进阶命令 04】lsof (看看是谁动了我的文件?)

文章目录 一、简介二、lsof语法2.1 基本格式2.2 选项2.3 输出字段解释 三、常用 lsof 操作3.1 查看某文件的相关进程3.2 网络相关:-i3.3 指定进程号打开的文件:-p3.4 指定用户打开的文件:-u3.5 某进程打开的文件:-c3.6 复合查询 四…...

华为OD机试真题 Java 实现【数字加减游戏】【2023Q1 200分】

一、题目描述 小明在玩一个数字加减游戏,只使用加法或者减法,将一个数字s变成数字t。 每个回合,小明可以用当前的数字加上或减去一个数字。 现在有两种数字可以用来加减,分别为a,其中b没有使用次数限制。 请问小明…...

Python: 结合多进程和 Asyncio 以提高性能

动动发财的小手,点个赞吧! 简介 多亏了 GIL,使用多个线程来执行 CPU 密集型任务从来都不是一种选择。随着多核 CPU 的普及,Python 提供了一种多处理解决方案来执行 CPU 密集型任务。但是直到现在,直接使用多进程相关的…...

只需要两步就能快速接入GPT

缘起 最近一个朋友提出,让我出个关于如何快速接入GPT的教程,今天就给大家安排上。 需要的工具 经过实测,这是迄今为止最便捷的接入方式,而且亲测有效。 首先,第一步你需要下载最新版的微软Edge浏览器,去…...

使用Git-lfs上传超过100m的大文件到GitHub

文章目录 1. 安装 git-lfs2. 在Git中安装git-ifs3. 找到工程中的所有大文件4.执行完这行命令,项目目录下会生成文件 .gitattributes,此时Git push将 .gitattributes 提交到远程仓库。 5. 需要注意的事 1. 安装 git-lfs Git Large File Storage | Git La…...

【网络】计算机中的网络

目录 🍁计算机网络 🍁计算机网络模型 🍁布线工程 🍁布线系统 🦐博客主页:大虾好吃吗的博客 🦐专栏地址:网络专栏 计算机网络 计算机网络的功能 数据通信、资源共享、增加可靠性、提…...

什么是语音识别的语音助手?

前言 语音助手已经成为现代生活中不可或缺的一部分。人们可以通过语音助手进行各种操作,如查询天气、播放音乐、发送短信等。语音助手的核心技术是语音识别。本文将详细介绍语音识别的语音助手。 语音识别的基本原理 语音识别是将语音信号转换为文本的技术。语音识…...

自己动手写一个加载器

前言 当在 linux 命令行中 ./ 运行一个程序时,实际上操作系统会调用加载器将这个程序加载到内存中去执行。为了探究加载器的行为,今天我们就自己动手写一个简单的加载器。 工作原理 加载器的工作原理: 从磁盘读取 bin 文件到内存&#xf…...

C# 性能优化和Unity性能优化

C# 性能优化 C# 性能优化是一个非常广泛的话题,需要从各个方面来考虑,包括算法和数据结构、编译器优化、代码优化等等。下面是一些常见的 C# 性能优化技巧: 选择正确的数据结构:C# 提供了各种不同的数据结构,例如数组、…...

面试题背麻了,花3个月面过华为测开岗,拿个26K不过分吧?

计算机专业,代码能力一般,之前有过两段实习以及一个学校项目经历。第一份实习是大二暑期在深圳的一家互联网公司做前端开发,第二份实习由于大三暑假回国的时间比较短(小于两个月),于是找的实习是在一家初创…...

跟着我学 AI丨教育 + AI = 一对一教学

随着人工智能(AI)技术的迅速发展,它已经开始了改变教育的方式。本文将介绍AI在教育行业中的应用场景,当前从事AI 教育的公司有哪些以及这些公司所提供的教育产品的特点,和未来AI 教育的潜在实现方式。 AI在教育行业的…...

1-动态规划算法理论基础

目录 1.什么是动态规划? PS:动态规划 VS 贪心 2.动态规划的解题步骤 ①确定dp数组(dp table)以及下标的含义。 ②确定递推公式/状态转移公式。 ③dp数组如何初始化。 ④确定遍历顺序。 ⑤举例推导dp数组。 3.动态规划应该如何debug…...

kafka延时队列内部应用简介

kafka延时队列_悠然予夏的博客-CSDN博客 两个follower副本都已经拉取到了leader副本的最新位置,此时又向leader副本发送拉取请求,而leader副本并没有新的消息写入,那么此时leader副本该如何处理呢?可以直接返回空的拉取结…...

【网络】HTTPHTTPS协议

文章目录 HTTP协议认识URLurlencode和urldecodeHTTP协议格式HTTP请求协议格式简单的小实验 HTTP响应协议格式关于封装解包分用 HTTP的方法关于GET和POST方法概念GET&POST对比(代码测试)测试POST和GET方法的区别 HTTP的状态码关于重定向的状态码临时重定向的代码演示: HTTP的…...

手把手教你用Skyline引擎实现丝滑的小程序交互动画(附左滑删除完整代码)

手把手教你用Skyline引擎实现丝滑的小程序交互动画(附左滑删除完整代码) 在移动应用开发中,流畅的动画效果是提升用户体验的关键因素。微信小程序的Skyline引擎为开发者提供了突破性的性能提升,特别适合实现复杂的手势交互和动画效…...

5个关键问题解析:ViGEmBus如何实现Windows游戏控制器完美模拟?

5个关键问题解析:ViGEmBus如何实现Windows游戏控制器完美模拟? 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 在游戏开发与兼容性优…...

深入计算机网络:理解OFA-Image-Caption模型API调用的HTTP协议与网络延迟

深入计算机网络:理解OFA-Image-Caption模型API调用的HTTP协议与网络延迟 你是不是也遇到过这种情况?调用一个图像描述(Image Captioning)模型的API,比如OFA模型,明明服务器处理图片只需要几百毫秒&#xf…...

GLM-. 全面支持与 Gemini CLI 集成:HagiCode 的多模型进化之路佣

1. 流图:数据的河流 如果把传统的堆叠面积图想象成一块块整齐堆叠的积木,那么流图就像一条蜿蜒流淌的河流,河道的宽窄变化自然流畅,波峰波谷过渡平滑。 它特别适合展示多个类别数据随时间的变化趋势,尤其是当你想强调整…...

别只盯着速度!STM32G474 CCM SRAM在电机控制FOC算法中的实战避坑指南

STM32G474 CCM SRAM在电机控制FOC算法中的高阶应用与避坑指南 电机控制领域对实时性的苛刻要求,让每一位工程师都在与时间赛跑。当你的PID调节器因为几微秒的延迟导致电机震动,或是中断服务程序(ISR)响应不及时引发系统不稳定时,CCM SRAM这个…...

别再吹牛了,% Vibe Coding 存在无法自洽的逻辑漏洞!故

简介 langchain中提供的chain链组件,能够帮助我门快速的实现各个组件的流水线式的调用,和模型的问答 Chain链的组成 根据查阅的资料,langchain的chain链结构如下: $$Input \rightarrow Prompt \rightarrow Model \rightarrow Outp…...

如何完整备份QQ空间历史说说:GetQzonehistory的终极解决方案

如何完整备份QQ空间历史说说:GetQzonehistory的终极解决方案 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾担心那些记录青春点滴的QQ空间说说会随着时间流逝而消失…...

论文复现基于改进人工鱼群法的机器人,无人机,无人车,无人船的路径规划算法,MATLAB

论文复现基于改进人工鱼群法的机器人,无人机,无人车,无人船的路径规划算法,MATLAB 在基本算法中加入了自适应视野和步长,加入了启发选择机制 该代码运行结果是那四个栅格地图的一个,只包含IAFSA的结果 运行…...

STM32WLE5CCU6实战:从官方例程到第三方模块的PingPong通信移植详解

1. STM32WLE5CCU6硬件平台与PingPong通信基础 STM32WLE5CCU6是ST推出的Sub-1GHz无线微控制器,集成了Cortex-M4内核和LoRa射频模块。与常见的NUCLEO-WL55JC开发板不同,实际项目中我们更常遇到采用QFN48封装的独立芯片方案,比如搭配亿佰特E77这…...

周红伟:替代龙虾的是什么?从 OpenClaw 到 Hermes:会自己长大的 AI 代理

这篇文章介绍了由 Nous Research 开发的开源 AI 代理 Hermes Agent。与前代产品 OpenClaw 相比,Hermes 最大的突破在于内置了完整的学习闭环——能从经验中自动创建和优化技能、跨会话记忆用户偏好,真正实现"越用越聪明"。文章涵盖项目核心特性…...