【Golang】Go语言中时间time相关处理方法

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,Golang开发,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:Go语言开发零基础到高阶实战
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • Go语言中的时间time
    • 1. 时间的基本获取
    • 2. 时间戳的获取与转换
    • 3. 时间的格式化
    • 4. 解析时间字符串
      • 4.1 基本解析
      • 4.2 带时区的解析
    • 5. 时间的计算
      • 5.1 时间的加减
      • 5.2 时间间隔的计算
      • 5.3 判断时间先后
    • 6. 时区处理
      • 6.1 时区表示
      • 6.2 时区转换
    • 7. 总结

Go语言中的时间time

在Go语言中,time 包是处理时间和日期的核心。它提供了丰富的函数和方法,用于显示、测量、计算、格式化、解析时间等。

1. 时间的基本获取

在Go语言中,time.Time 类型用于表示时间。我们可以通过 time.Now() 函数获取当前的时间对象,进而获取年、月、日、时、分、秒等信息。

示例代码

package mainimport ("fmt""time"
)func main() {now := time.Now()fmt.Printf("current time: %v\n", now)//得到的是time.Time类型的结构体数据,包含 常量:日月年时分秒 周日-周六 方法:获取常量,计算。fmt.Printf("current time数据类型: %T\n", now)//打印年月日时分秒,得到的都是int类型数据year := now.Year()month := now.Month()day := now.Day()hour := now.Hour()minute := now.Minute()second := now.Second()//Printf : 整数补位--02如果不足两位,左侧用0补齐输出fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)
}

通过now.Year()等得到的都是int类型数据
在这里插入图片描述

在这里插入图片描述

2. 时间戳的获取与转换

时间戳是自1970年1月1日(08:00:00 GMT)至当前时间的总秒数(或毫秒数)。
Go语言中,可以通过time.Now().Unix()获取秒级时间戳,通过time.Now().UnixNano()获取纳秒级时间戳。

示例代码

package main  import (  "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)  // 将时间戳转换为时间对象  timeObj := time.Unix(timestamp1, 0)  fmt.Println(timeObj)  // 转换为指定时区的时间对象  secondsEastOfUTC := int((8 * time.Hour).Seconds())  beijing := time.FixedZone("Beijing Time", secondsEastOfUTC)  beijingTimeObj := time.Unix(timestamp1, 0).In(beijing)  fmt.Println(beijingTimeObj)  
}

在这里插入图片描述

通过time.Now().Unix()获取的时间戳是int64数据类型
在这里插入图片描述

如果想要通过时间戳字符串转化为时间格式,需要将时间戳字符串转化为int64类型数据

package mainimport ("fmt""strconv""time"
)func main() {//时间戳字符串timrstr := "1617922800"//时间戳是int64类型数据,将时间戳字符串转化为int64类型timestamp, err := strconv.ParseInt(timrstr, 10, 64)if err != nil {fmt.Println("err:", err)return}t := time.Unix(timestamp, 0)fmt.Println(t)
}

在这里插入图片描述

3. 时间的格式化

Go语言允许你按照特定的格式来格式化时间对象,或者将字符串按照指定的格式解析为时间对象。
time.Time 提供了 Format 方法来格式化时间。
func (t Time) Format(layout string) string
Go语言的时间格式化模板不是常见的Y-m-d H:M:S,而是使用Go的诞生时间2006年1月2日 15点04分作为记忆口诀。
格式化模板使用Go的出生时间“2006年1月2日 15时04分05秒”(记忆口诀为“2006 1 2 3 4 5”)。
模板必须用这个时间,否则格式化不了

格式化时间

package main  import (  "fmt"  "time"  
)  func main() {  // 时间格式化 2023-02-23 20:43:49// 格式化模板: yyyy-MM-dd HH:mm:ss// Go语言诞生的时间作为格式化模板:2006年1月2号下午3点4分5秒// Go语言格式化时间的代码:2006-01-02 15:04:05  (记忆方式:2006 12 345)// 固定的:"2006-01-02 15:04:05"now := time.Now()// 24小时制fmt.Println(now.Format("2006-01-02 15:04:05")) //2024-09-29 16:34:52// 12小时制fmt.Println(now.Format("2006-01-02 03:04:05 PM")) //2024-09-29 04:34:52 PM// 自定义格式fmt.Println(now.Format("Jan 2, 2006 at 3:04pm (MST)")) // Sep 29, 2024 at 4:34pm (CST)fmt.Println(now.Format("2006/01/02 15:04"))            // 2024/09/29 16:34fmt.Println(now.Format("15:04 2006/01/02"))            // 16:34 2024/09/29fmt.Println(now.Format("2006/01/02"))                  // 2024/09/29}

在这里插入图片描述

4. 解析时间字符串

time.Parse 和 time.ParseInLocation 函数可以将符合特定格式的字符串解析为 time.Time 对象。
Parse函数默认使用本地时区,而ParseInLocation允许指定时区。

4.1 基本解析

func Parse(layout, value string) (Time, error)

package main  import (  "fmt"  "time"  
)  func main() {  const layout = "2006-01-02 15:04:05"   //模板时间必须是这个// 假设这是需要解析的时间字符串  const timeStr = "2023-09-10 12:34:56"  t, err := time.Parse(layout, timeStr)  if err != nil {  fmt.Println("Error parsing time:", err)  return  }  fmt.Println("Parsed time:", t)  
}

在这里插入图片描述

加入我们模板时间用错,解析报错
在这里插入图片描述

4.2 带时区的解析

如果时间字符串中包含时区信息,可以使用 time.ParseInLocation 进行解析,并指定时区。
加载时区
func LoadLocation(name string) (*Location, error)

package main  import (  "fmt"  "time"  
)  func main() {  // 假设这是需要解析的时间字符串,包含时区信息  const layout = "2006-01-02 15:04:05 MST"  const timeStr = "2023-09-10 12:34:56 CST"  // 加载时区  loc, err := time.LoadLocation("Asia/Shanghai")  if err != nil {  fmt.Println("Error loading location:", err)  return  }  t, err := time.ParseInLocation(layout, timeStr, loc)  if err != nil {  fmt.Println("Error parsing time:", err)  return  }  fmt.Println("Parsed time with location:", t)  
}

在这里插入图片描述

5. 时间的计算

time 包提供了丰富的函数和方法来支持时间的计算,如时间的加减、时间间隔的计算等。

5.1 时间的加减

使用 time.Time 的 Add 方法可以在原有时间的基础上加上或减去一定的时间间隔。

package main  import (  "fmt"  "time"  
)  func main() {  now := time.Now()  // 加上一小时  oneHourLater := now.Add(time.Hour)  fmt.Println("One hour later:", oneHourLater)  // 减去一天  oneDayAgo := now.Add(-24 * time.Hour)  fmt.Println("One day ago:", oneDayAgo)  
}

在这里插入图片描述

5.2 时间间隔的计算

time.Duration 类型代表两个时间点之间经过的时间,以纳秒为单位。可以使用 time.Time 的 Sub 方法来计算两个时间点之间的时间间隔。

package main  import (  "fmt"  "time"  
)  func main() {  start := time.Now()  // 假设这里有一些耗时操作  time.Sleep(2 * time.Second)  end := time.Now()  duration := end.Sub(start)  fmt.Println("Duration:", duration)  // 转换为不同单位hours := duration.Hours()minutes := duration.Minutes()seconds := duration.Seconds()fmt.Printf("Duration in hours: %v\n", hours)fmt.Printf("Duration in minutes: %v\n", minutes)fmt.Printf("Duration in seconds: %v\n", seconds)
}

在这里插入图片描述

使用time.ParseDuration解析时间间隔字符串

d, _ := time.ParseDuration("1.2h")
fmt.Println("Parsed Duration:", d)

在这里插入图片描述

5.3 判断时间先后

package main  import (  "fmt"  "time"  
)  func main() {  t1 := time.Now()t2 := t1.Add(time.Hour)fmt.Println(t1)fmt.Println(t2)// 判断时间先后fmt.Println(t1.Before(t2)) // truefmt.Println(t1.After(t2))  // falsefmt.Println(t1.Equal(t2))  // false}

在这里插入图片描述

6. 时区处理

6.1 时区表示

在Go语言中,时区通过time.Location类型表示。可以使用time.LoadLocation函数加载一个时区,或者使用time.FixedZone函数创建一个固定偏移量的时区。

package main  import (  "fmt"  "time"  
)  func main() {  // 加载时区  loc, err := time.LoadLocation("Asia/Shanghai")  if err != nil {  fmt.Println("Error loading location:", err)  return  }  fmt.Println(loc)  // 创建固定偏移量的时区  beijing := time.FixedZone("Beijing Time", 8*3600)  fmt.Println(beijing)  
}

在这里插入图片描述

6.2 时区转换

在处理跨时区的时间时,可能需要将时间从一个时区转换到另一个时区。这通常涉及到创建两个时间对象,一个代表原始时间,另一个代表转换后的时间,并指定不同的时区。

package main  import (  "fmt"  "time"  
)  func main() {  // 原始时间(UTC)  utcTime := time.Date(2023, 9, 10, 12, 0, 0, 0, time.UTC)  fmt.Println("UTC Time:", utcTime)  // 转换为北京时间  beijingLoc, err := time.LoadLocation("Asia/Shanghai")  if err != nil {  fmt.Println("Error loading location:", err)  return  }  beijingTime := utcTime.In(beijingLoc)  fmt.Println("Beijing Time:", beijingTime)  
}

在这里插入图片描述

7. 总结

Go 语言中的 time 包提供了强大的时间处理功能,包括时间的表示、计算、格式化和解析等。通过本文的详细介绍和实际应用案例,相信读者已经对 Go 语言中的时间处理有了更深入的了解。在实际编程中,合理利用 time 包的功能,可以大大简化时间相关的操作,提高编程效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/440175.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

认识动态规划算法和实践(java)

前言 动态规划算法里面最有意思的一个东西之一。动态规划初学肯定会有一定晦涩难懂。如果我们去网上搜索,动态规划的资料,它一开始都是将很多的理论,导致会认为很难,但是这个东西实际上是有套路的。 动态规划的英语是Dynamic Pr…

MySQL之分库分表后带来的“副作用”你是怎么解决的?

目录标题 一、垂直分表后带来的隐患二、水平分表后带来的问题1.多表联查问题2.增删改数据问题3.聚合操作问题 三、垂直分库后产生的问题1.跨库join问题2.分布式事务问题3.部分业务库依然存在的性能问题 四、水平分库后需要解决的问题1.聚合操作和连表问题2.数据分页问题3.ID主键…

10款好用的开源 HarmonyOS 工具库

大家好,我是 V 哥,今天给大家分享10款好用的 HarmonyOS的工具库,在开发鸿蒙应用时可以用下,好用的工具可以简化代码,让你写出优雅的应用来。废话不多说,马上开整。 1. efTool efTool是一个功能丰富且易用…

全球IP归属地查询-IP地址查询-IP城市查询-IP地址归属地-IP地址解析-IP位置查询-IP地址查询API接口

IP地址城市版查询接口 API是指能够根据IP地址查询其所在城市等地理位置信息的API接口。这类接口在网络安全、数据分析、广告投放等多个领域有广泛应用。以下是一些可用的IP地址城市版查询接口API及其简要介绍 1. 快证 IP归属地查询API 特点:支持IPv4 提供高精版、…

k8s 中微服务之 MetailLB 搭配 ingress-nginx 实现七层负载

目录 1 MetailLB 搭建 1.1 MetalLB 的作用和原理 1.2 MetalLB功能 1.3 部署 MetalLB 1.3.1 创建deployment控制器和创建一个服务 1.3.2 下载MealLB清单文件 1.3.3 使用 docker 对镜像进行拉取 1.3.4 将镜像上传至私人仓库 1.3.5 将官方仓库地址修改为本地私人地址 1.3.6 运行清…

【前端】-音乐播放器(源代码和结构讲解,大家可以将自己喜欢的歌曲添加到数据当中,js实现页面动态显示音乐)

前言:音乐播放器是前端开发中的一个经典项目,通过它可以掌握很多核心技术,如音频处理、DOM操作、事件监听、动画效果等。这个项目不仅能提升前端开发的技能,还能让开发者深入理解JavaScript与HTML的协同作用。 页面展示&#xff1…

Web安全 - 文件上传漏洞(File Upload Vulnerability)

文章目录 OWASP 2023 TOP 10导图定义攻击场景1. 上传恶意脚本2. 目录遍历3. 覆盖现有文件4. 文件上传结合社会工程攻击 防御措施1. 文件类型验证2. 文件名限制3. 文件存储位置4. 文件权限设置5. 文件内容检测6. 访问控制7. 服务器配置 文件类型验证实现Hutool的FileTypeUtil使用…

Python中的机器学习:从入门到实战

机器学习是人工智能领域的一个重要分支,它通过构建模型来使计算机从数据中学习并做出预测或决策。Python凭借其丰富的库和强大的生态系统,成为了机器学习的首选语言。本文将从基础到实战,详细介绍如何使用Python进行机器学习,涵盖…

【汇编语言】寄存器(CPU工作原理)(二)—— 汇编指令的基础操作

文章目录 前言正文——(一气呵成解决本文内容)结语 前言 📌 汇编语言是很多相关课程(如数据结构、操作系统、微机原理)的重要基础。但仅仅从课程的角度出发就太片面了,其实学习汇编语言可以深入理解计算机底…

Android Framework AMS(02)AMS启动及相关初始化5-8

该系列文章总纲链接:专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明: 说明:本章节主要涉及systemserver启动AMS及初始化AMS相关操作。同时由于该部分内容过多,因此拆成2个章节,本章节是第二章节&…

LabVIEW提高开发效率技巧----使用动态事件

在LabVIEW开发过程中,用户交互行为可能是多样且不可预知的。为应对这些变化,使用动态事件是一种有效的策略。本文将从多个角度详细介绍动态事件的概念及其在LabVIEW开发中的应用技巧,并结合实际案例,说明如何通过动态事件提高程序…

Vector不清晰点学习易错点

什么是迭代器 是一个广义指针它可以是指针,也可以是一个可对其执行类似指针得操作-如解除引用(如operator*())和递增(operator())STL中每个容器类都定义了一个合适的迭代器,该迭代器的类型是一个名为itera…

【Python游戏开发】贪吃蛇游戏demo拓展

拓展上一项目【Python游戏开发】贪吃蛇 实现穿墙效果 # 检测游戏是否结束 def check_gameover():global finished# 移除蛇头位置超过窗口判断for n in range(len(body) - 1):if(body[n].x snake_head.x and body[n].y snake_head.y):finished True # 状态检测 def ch…

html5 + css3(下)

目录 CSS基础基础认识体验cssCSS引入方式 基础选择器选择器-标签选择器-类选择器-id选择器-通配符 字体和文本样式1.1 字体大小1.2 字体粗细1.3 字体样式(是否倾斜)1.4 常见字体系列(了解)1.5 字体系列拓展-层叠性font复合属性文本…

oh-crop: OpenHarmony/HarmonyOS上的简单的图片剪裁库,可用于头像剪裁等常见场景。

📚 简介 oh-crop: OpenHarmony/HarmonyOS上的简单的图片剪裁库,可用于头像剪裁等常见场景。 代码仓库:oh-crop 📚 下载安装 ohpm i xinyansoft/oh-cropOpenHarmony ohpm 环境配置等更多内容,请参考: 下载安装三方库…

一个值得关注的3D生成新算法:速度和图像生成平齐,能生成合理的展开贴图和高质量mesh

今天跟大家介绍的GIMDiffusion是一种新的Text-to-3D模型,利用几何图像(Geometry Images)来高效地表示3D形状,避免了复杂的3D架构。通过结合现有的Text-to-Image模型如Stable Diffusion的2D先验知识,GIMDiffusion能够在…

【数据结构】【链表代码】相交链表

/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {//先求出两个链表的长度ListNode…

Unity 编辑器多开

开发多人联机的功能时大多数会遇到测试机不方便的问题。想多开同一个项目Uinty又禁止。。。因为在使用Unity Editor打开一个项目时,Unity Editor会在项目目录建立一个Temp目录,同时对里面的一个UnityLockfile文件进行加锁。SO...可以使用以下方法进行多开…

【easypoi 一对多导入解决方案】

easypoi 一对多导入解决方案 1.需求2.复现问题2.1校验时获取不到一对多中多的完整数据2.2控制台报错 Cannot add merged region B5:B7 to sheet because it overlaps with an existing merged region (B3:B5). 3.如何解决第二个问题处理: Cannot add merged region …

ISO IEC 18004 2015 PDF 文字版下载

ISO_IEC_18004_2015_en-US - 道客巴巴 (doc88.com)https://www.doc88.com/p-67816330893254.html