【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 main

import (
    "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 main

import (
    "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:34
    fmt.Println(now.Format("15:04 2006/01/02"))            // 16:34 2024/09/29
    fmt.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)) // true
    fmt.Println(t1.After(t2))  // false
    fmt.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 包的功能,可以大大简化时间相关的操作,提高编程效率。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

将列表中的各字符串sn连接成为一个字符串s使用;将各sn间隔开os.pathsep.join()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 将列表中的各字符串sn 连接成为一个字符串s 使用;将各sn间隔开 os.pathsep.join() [太阳]选择题 下列说法中正确的是? import os paths ["/a", "/b/c", "/d&q…

Linux 系统五种帮助命令的使用

Linux 系统五种帮助命令的使用 本文将介绍 Linux 系统中常用的帮助命令,包括 man、–help、whatis、apropos 和 info 命令。这些命令对于新手和有经验的用户来说,都是查找命令信息、理解命令功能的有力工具。 文章目录 Linux 系统五种帮助命令的使用一…

2024年计算机视觉与艺术研讨会(CVA 2024)

目录 基本信息 大会简介 征稿主题 会议议程 参会方式 基本信息 大会官网:www.icadi.net(点击了解参会投稿等信息) 大会时间:2024年11月29-12月1日 大会地点:中国-天津 大会简介 2024年计算机视觉与艺术国际学术…

初阶C语言-指针

1.指针是什么? 理解指针的两个要点: 1.指针是内存中一个最小单元的编号,也就是地址 2.口头语中说的指针,通常是指指针变量,是用来存放内存地址的变量 总结:指针就是地址,口语中说的指针通常是指…

【Spring】“请求“ 之传递 JSON 数据

文章目录 JSON 概念JSON 语法JSON 的语法JSON 的两种结构 JSON 字符串和 Java 对象互转JSON 优点传递 JSON 对象 JSON 概念 JSON:JavaScript Object Notation【JavaScript 对象表示法】 JSON 就是一种数据格式,有自己的格式和语法,使用文本…

Vue组件库Element-ui

Vue组件库Element-ui Element是一套为开发者、设计师和产品经理准备的基于Vue2.0的桌面端组件库。Element - 网站快速成型工具 安装element-ui npm install element-ui # element-ui版本(可以指定版本号引入ElementUI组件库,在main.js中添加内容得到&…

IDEA的lombok插件不生效了?!!

记录一下,防止找不到解决方案,已经遇到好几次了 前面啰嗦的多,可以直接跳到末尾的解决方法,点击一下 问题现场情况 排查过程 确认引入的依赖正常 —》🆗 idea 是否安装了lombok插件 --》🆗 貌似没有问题…

保姆级手把手使用YOLOv11训练自己数据集(含源代码、网络结构、模型检测和转换 、数据集查找、模型训练)

文章目录 前言项目地址项目内容:网络模型结构性能测试任务描述任务内容 项目运行模型训练 前言 本教程内含YOLOv11网络结构图训练教程推理教程数据集获取等有关的内容~ 项目地址 YOLO11是Ultralytics YOLO系列实时目标检测器的最新迭代版本,它以尖端的…

北交大研究突破:塑料光纤赋能低成本无摄像头AR/VR眼动追踪技术

北交大研究:探索无摄像头低成本AR/VR眼动追踪新路径 在AR/VR技术领域,眼动追踪作为一项关键技术,对于提升用户体验、优化渲染效率具有重要意义。然而,传统的眼动追踪方案多依赖于高成本的摄像头,这不仅增加了设备的制造…

Python 工具库每日推荐 【Pandas】

文章目录 引言Python数据处理库的重要性今日推荐:Pandas工具库主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:销售数据分析案例分析高级特性数据合并和连接时间序列处理数据透视表扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 TypeScrip…

市面上8款AI论文大纲一键生成文献的软件推荐

在当前的学术研究和写作领域,AI论文大纲自动生成软件已经成为提高写作效率和质量的重要工具。这些工具不仅能够帮助研究人员快速生成论文草稿,还能进行内容优化、查重和排版等操作。本文将分享市面上8款AI论文大纲一键生成文献的软件,并特别推…

一文了解构建工具——Maven与Gradle的区别

目录 一、Maven和Gradle是什么? 构建工具介绍 Maven介绍 Gradle介绍 二、使用时的区别: 1、新建项目 Maven: Gradle: 2、配置项目 Maven: Gradle: 3、构建项目——生成项目的jar包 Gradle&…

用小学生可以理解的语言讲一下什么是大模型

好的,用小学生的语言来说,大模型就像是一个超级聪明的机器人老师,它懂得很多东西,可以帮助我们做很多事情。 1. **懂得很多**:大模型知道很多知识,就像一个巨大的图书馆,里面有很多书&#xff0…

IDEA 2024.3 预览:把开发者感动到哭了

幸运的人, 一生都被童年治愈; 不幸的人, 一生都在治愈童年 只有勇敢的人 和有钱的人才能先享受世界 缘分就是我还不知道 会见到你就误打误撞般 遇见了你 最近 IDEA 又发布了最新的 2024.3 的预览版本 EAP,把开发者的心激动的…

今日指数-day08实战完整代码

今日指数-day08 1. 个股最新分时行情数据 1.1 个股最新分时行情功能说明 1)个股最新分时行情功能原型 2)个股最新分时行情数据接口分析 功能描述:获取个股最新分时行情数据,主要包含:开盘价、前收盘价、最新价、最…

AI周报(9.29-10.5)

AI应用-Elayne公司临终规划和自动化遗产结算 创业公司Elayne成立于2023年,由Adria Ferrier和Jake Grafenstein共同创立,Adria Ferrier担任CEO,总部位于科罗拉多州丹佛市。 Elayne公司专注于遗产规划和结算领域,通过人工智能技术…

【Diffusion分割】CTS:基于一致性的医学图像分割模型

CTS: A Consistency-Based Medical Image Segmentation Model 摘要: 在医学图像分割任务中,扩散模型已显示出巨大的潜力。然而,主流的扩散模型存在采样次数多、预测结果慢等缺点。最近,作为独立生成网络的一致性模型解决了这一问…

【C++】STL——list的模拟实现

目录 前言list介绍list的模拟实现总体结构节点类迭代器类链表类 默认成员函数构造函数拷贝构造赋值重载析构函数 迭代器实现双向迭代器迭代器的其他功能用多参数模板完成最终的迭代器类 list的容量相关和数据访问empty()和size()front()和back() list的修改操作任意位置插入和删…

数据结构 ——— C语言实现无哨兵位单向不循环链表

目录 前言 动态顺序表的缺陷 单链表的概念 单链表中节点的结构 单链表逻辑结构示意图​编辑 实现单链表前的准备工作 实现单链表 1. 定义节点的指针 2. 创建节点 3. 打印单链表中的所有数据 4. 在单链表头部插入数据 5. 在单链表尾部插入数据 6. 在单链表头部删除数…

脏读、不可重复读、幻读的解决方法

上一篇博客提到了脏读、不可重复读、幻读的含义,也知道了是因为什么情况导致出现的这些问题,这篇博客就带大家一起来了解一下他们的解决办法~ 脏读:脏读出现的原因主要是因为一个事务读取了另外一个事务未提交的数据,就可能出现脏…