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

Go语言Time包的使用

原文链接,关注可获取更新

time包

Go语言中有关于时间和日期的方法都在time包里面,Go语言的time包为开发者提供了一套全面而简洁的工具来处理时间相关的操作。包括解析和格式化时间字符串,计算时间差和时区转换等,time包时Go语言中处理时间和日期的核心组件。

时间类型(Time)

time包中的Time结构体表示的是时间类型,在Go语言中,我们可以使用time.Now()方法来获取当前的时间,该方法返回的就是Time类型,调用Time类型的方法就可以分别获取到当前时间的年月日时分秒等信息。

func main() {now := time.Now()fmt.Println(now) // 2024-07-23 19:36:03.4481196 +0800 CST m=+0.004232101fmt.Println(now.Year())   // 2024fmt.Println(now.Month())  // Julyfmt.Println(now.Day())    // 23fmt.Println(now.Hour())   // 19fmt.Println(now.Minute()) // 36fmt.Println(now.Second()) // 3
}

时间格式化

从上面的输出可以看到当前日期的输出后面还携带了有其他的消息,不是我们常用的格式,这个时候就可以使用Go语言的时间格式化功能,使用format方法并执行格式化模板,Go语言的格式化模版并不是常用的Y-m-d H:M:S,而是2006-01-02 15:04:05,记忆方法:200612345(相传这个时间为Go语言诞生时间,不知真假)。

func main() {now := time.Now()fmt.Println(now.Format("2006-01-02 15:04:05"))    // 2024-07-23 19:37:58fmt.Println(now.Format("2006-01-02 03:04:05 PM")) // 2024-07-23 07:41:20 PMfmt.Println(now.Format("2006/01/02 15:04"))       // 2024/07/23 19:40fmt.Println(now.Format("15:04 2006/01/02"))       // 19:40 2024/07/23fmt.Println(now.Format("2006/01/02"))             // 2024/07/23
}

除了自己写格式化模版之外,Go语言已经内置了一部分模版可供选择,模版在format包里面,可以直接使用,源码如下:

const (Layout      = "01/02 03:04:05PM '06 -0700" // The reference time, in numerical order.ANSIC       = "Mon Jan _2 15:04:05 2006"UnixDate    = "Mon Jan _2 15:04:05 MST 2006"RubyDate    = "Mon Jan 02 15:04:05 -0700 2006"RFC822      = "02 Jan 06 15:04 MST"RFC822Z     = "02 Jan 06 15:04 -0700" // RFC822 with numeric zoneRFC850      = "Monday, 02-Jan-06 15:04:05 MST"RFC1123     = "Mon, 02 Jan 2006 15:04:05 MST"RFC1123Z    = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zoneRFC3339     = "2006-01-02T15:04:05Z07:00"RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"Kitchen     = "3:04PM"// Handy time stamps.Stamp      = "Jan _2 15:04:05"StampMilli = "Jan _2 15:04:05.000"StampMicro = "Jan _2 15:04:05.000000"StampNano  = "Jan _2 15:04:05.000000000"DateTime   = "2006-01-02 15:04:05"DateOnly   = "2006-01-02"TimeOnly   = "15:04:05"
)

时间戳

时间戳是自1970年1月1日(08:00:00GMT)至当前时间的总毫秒数,也被称为Unix时间戳,在Go语言里面,可以获取四种级别的时间戳,分别是秒、毫秒、微秒和纳秒。

func main() {now := time.Now()fmt.Println(now.Unix())      // 1721735188fmt.Println(now.UnixMilli()) // 1721735188504fmt.Println(now.UnixMicro()) // 1721735188504566fmt.Println(now.UnixNano())  // 1721735188504566800
}

时间间隔

在time包里面还定义了一个Duration类型,Duration表示时间间隔,例如可以直接使用time.Second表示1秒,time.Hour * 3表示3个小时,Duration源码定义如下:

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

时间操作

在Go语言里面还可以非常简单的进行时间的比较以及计算

时间计算

可以使用Add方法在当前时间的基础上加上指定的时间间隔。

func main() {now := time.Now()fmt.Println(now)                    // 2024-07-23 19:52:14.0840934 +0800 CST m=+0.004981601fmt.Println(now.Add(time.Hour * 2)) // 2024-07-23 21:52:14.0840934 +0800 CST m=+7200.004981601
}

时间间隔

还可以使用Sub方法计算两个时间之间相隔了多长时间,

func main() {now := time.Now()fmt.Println(now.Sub(now.Add(time.Hour * -2))) // 2h0m0s
}

之前

使用Before判断一个时间是否在另一个时间之前

func main() {now := time.Now()fmt.Println(now.Before(now.Add(time.Hour))) // true
}

之后

使用After判断一个时间是否在另一个时间之后

func main() {now := time.Now()fmt.Println(now.After(now.Add(time.Hour))) // false
}

相同

使用Equal判断两个时间是否相同

func main() {now := time.Now()fmt.Println(now.Equal(now.Add(time.Hour))) // false
}

时间转换

字符串转时间

func main() {timeStr := "2024-07-23 12:23:34"time1, _ := time.Parse(time.DateTime, timeStr)fmt.Println(time1) // 2024-07-23 12:23:34 +0000 UTCtime2, _ := time.ParseInLocation(time.DateTime, timeStr, time.Local)fmt.Println(time2) // 2024-07-23 12:23:34 +0800 CST
}

可以使用Parse和ParseInLocation将字符串时间转成Time类型的时间,两者的区别如下:

  • time.Parse 总是将时间解析为 UTC 时区
  • time.ParseInLocation 允许指定一个时区解析

时间戳转时间

func main() {time1 := time.Unix(1721735188, 0)time2 := time.UnixMilli(1721735188504)time3 := time.UnixMicro(1721735188504566)fmt.Println(time1) // 2024-07-23 19:46:28 +0800 CSTfmt.Println(time2) // 2024-07-23 19:46:28.504 +0800 CSTfmt.Println(time3) // 2024-07-23 19:46:28.504566 +0800 CST
}

使用time包的Unix、UnixMilli和UnixMicro可以分别将秒、毫秒、微秒级别的时间戳转成相应的Time类型的时间。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C. Propagating tree
  • HTML5 浏览器支持
  • XML CSS:结构和样式的完美结合
  • 秋招突击——8/16——字节广告业务——面经整理——二面挂
  • 【docker compose 部署和 go 热部署工具fresh】
  • git rebase和git merge的区别
  • EazyDraw for Mac 矢量图绘制设计软件
  • MySQL 学习笔记之事务操作
  • yd云手机登录算法分析
  • EXCEL 分段排序--Excel难题#86
  • 趣味算法------尾部零的个数(C语言,python双重解法)
  • 【微信小程序】使用 npm 包 - API Promise化-- miniprogram-api-promise
  • 出现Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are requiredProperty报错
  • C语言函数介绍(上)
  • [Qt][QSS][下]详细讲解
  • 【391天】每日项目总结系列128(2018.03.03)
  • CSS居中完全指南——构建CSS居中决策树
  • css属性的继承、初识值、计算值、当前值、应用值
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Just for fun——迅速写完快速排序
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 测试开发系类之接口自动化测试
  • 初识 beanstalkd
  • 创建一种深思熟虑的文化
  • 前端自动化解决方案
  • 浅谈web中前端模板引擎的使用
  • 区块链共识机制优缺点对比都是什么
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 网络应用优化——时延与带宽
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • #宝哥教你#查看jquery绑定的事件函数
  • (二)Linux——Linux常用指令
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (算法)求1到1亿间的质数或素数
  • (一)Linux+Windows下安装ffmpeg
  • (转)c++ std::pair 与 std::make
  • (转载)虚函数剖析
  • ***监测系统的构建(chkrootkit )
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NET C# 配置 Options
  • .net 使用ajax控件后如何调用前端脚本
  • .net 提取注释生成API文档 帮助文档
  • .NET 直连SAP HANA数据库
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .net开发时的诡异问题,button的onclick事件无效
  • .net中调用windows performance记录性能信息
  • :not(:first-child)和:not(:last-child)的用法