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 文件到内存…...
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的…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)
引言 在嵌入式系统中,用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例,介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单,执行相应操作,并提供平滑的滚动动画效果。 本文设计了一个…...