时间类型

time.Time类型表示时间。我们可以通过time.Now()函数获取当前的时间对象,然后获取时间对象的年月日时分秒等信息。示例代码如下:

func main() {
current := time.Now()
fmt.Println(current)
// 2021-11-26 16:13:54.3960877 +0800 CST m=+0.011114601 // 将时间类型转换成字符串类型
strCurrent := current.Format("2006-01-02 15:04:05")
fmt.Println(strCurrent) // 2021-11-26 16:18:23 +0000 UTC // 字符串类型转换成时间类型
timeCurrent, _ := time.Parse("2006-01-02 15:04:05", strCurrent)
fmt.Println(timeCurrent) // 2021-11-26 16:18:23 +0000 UTC // 获取年月日、时分秒中的单个int值,month是Month类型,Month是自定义的int类型
year := current.Year()
month := current.Month()
day := current.Day()
hour := current.Hour()
minute := current.Minute()
second := current.Second()
fmt.Printf("%d-%2d-%2d %2d:%2d:%2d\n", year, month, day, hour, minute, second)
// 2021-11-26 16:13:54 }

时间戳

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

  1. 基于时间对象获取时间戳的示例代码如下:
func main() {
now := time.Now()
timestamp1 := now.Unix() // 秒
timestamp2 := now.UnixMilli() // 毫秒
timestamp3 := now.UnixMicro() // 微秒
timestamp4 := now.UnixNano() // 纳秒 fmt.Println(timestamp1) // 1637915082
fmt.Println(timestamp2)
fmt.Println(timestamp3)
fmt.Println(timestamp4) // 1637915082773954700 }
  1. 使用time.Unix()函数可以将时间戳转为时间格式。
func main() {
now := time.Now()
fmt.Println(now) // 2021-11-26 16:31:22.4630069 +0800 CST m=+0.011961601
timestamp1 := now.Unix() // 时间戳秒 current := time.Unix(timestamp1, 0) // 将时间戳转换为时间格式
fmt.Println(current) // 2021-11-26 16:30:53 +0800 CST }

时间操作

Add

我们在日常的编码过程中可能会遇到要求时间+时间间隔的需求,Go语言的时间对象有提供Add方法如下:

func main() {
now := time.Now()
ret := now.Add(time.Hour + 30 * time.Minute) // 计算一个半小时以后的时间
fmt.Println(ret)
}

Sub

求两个时间之间的差值:

func main() {
now := time.Now()
endTime := now.Add(time.Hour + 30 * time.Minute) // 计算一个半小时以后的时间 duration := endTime.Sub(now) // 计算时间差
fmt.Println(duration) // 输出:1h30m0s
}

返回一个时间段t-u。如果结果超出了Duration可以表示的最大值/最小值,将返回最大值/最小值。要获取时间点t-d(d为Duration),可以使用t.Add(-d)。

Equal

func main() {
now := time.Now()
endTime := now.Add(time.Hour + 30 * time.Minute) // 计算一个半小时以后的时间
now2 := time.Now() // 比较两个时间是否相等
boo := endTime.Equal(now)
boo2 := now2.Equal(now)
fmt.Println(boo, boo2) // false true
}

判断两个时间是否相同,会考虑时区的影响,因此不同时区标准的时间也可以正确比较。本方法和用t==u不同,这种方法还会比较地点和时区信息。

Before

func main() {
now := time.Now()
end := now.Add(time.Second) boo1 := now.Before(end)
fmt.Println(boo1) // true boo2 := end.Before(now)
fmt.Println(boo2) // false
}

如果t代表的时间点在u之前,返回真;否则返回假。

After

func (t Time) After(u Time) bool

如果t代表的时间点在u之后,返回真;否则返回假。

定时器

使用time.Tick(时间间隔)来设置定时器,定时器的本质上是一个通道(channel)

  1. 方法一:
func main() {
// 使用time.Tick时间间隔来设置定时器,定时器的本质是一个通道channel
ticker := time.Tick(time.Second) // 定义一个1秒间隔的定时器
for i := range ticker {
fmt.Println(i.Format("2006-01-02 15:04:05")) // 每格一秒执行一次任务
}
}

输出结果:

2021-11-29 10:01:36

2021-11-29 10:01:37

2021-11-29 10:01:38

  1. 方法二:
func main() {
// 使用time.Tick时间间隔来设置定时器,定时器的本质是一个通道channel
ticker := time.NewTicker(time.Second * 2)
for i := range ticker.C {
fmt.Println(i.Format("2006-01-02 15:04:05"))
}
}

时间格式化

时间类型有一个自带的方法Format进行格式化,需要注意的是Go语言中格式化时间模板不是常见的Y-m-d H:M:S而是使用Go的诞生时间2006年1月2号15点04分(记忆口诀为2006 1 2 3 4)。也许这就是技术人员的浪漫吧。

补充:如果想格式化为12小时方式,需指定PM。

func main() {
now := time.Now()
fmt.Println(now.Format("2006-01-02 15:04:05 Mon Jan")) // 24小时制
// 2021-11-29 10:17:00 Mon Nov
fmt.Println(now.Format("03:04:05 2006/01/02 PM Mon Jan")) // 12小时制
// 10:17:00 2021/11/29 AM Mon Nov
fmt.Println(now.Format("2006-01-02"))
// 2021-11-29
}

解析字符串格式的时间

func main() {
// 解析字符串格式的时间
now := time.Now()
fmt.Println(now)
// 加载时区
loc, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
fmt.Println(err.Error())
return
}
// 按照指定时区和指定格式解析字符串时间
timeObj, err := time.ParseInLocation("2006/01/02 15:04:05", "2021/11/28 23:59:59", loc)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println(timeObj)
fmt.Println(now.Sub(timeObj))
}

输出结果:

2021-11-29 10:39:02.8339716 +0800 CST m=+0.010589201

2021-11-28 23:59:59 +0800 CST

10h39m3.8339716s

golang中的标准库time的更多相关文章

  1. golang中的标准库数据格式

    数据格式介绍 是系统中数据交互不可缺少的内容 这里主要介绍JSON.XML.MSGPack JSON json是完全独立于语言的文本格式,是k-v的形式 name:zs 应用场景:前后端交互,系统间数 ...

  2. golang中的标准库context

    在 Go http包的Server中,每一个请求在都有一个对应的 goroutine 去处理.请求处理函数通常会启动额外的 goroutine 用来访问后端服务,比如数据库和RPC服务.用来处理一个请 ...

  3. golang中的标准库log

    Go语言内置的log包实现了简单的日志服务.本文介绍了标准库log的基本使用. 使用Logger log包定义了Logger类型,该类型提供了一些格式化输出的方法.本包也提供了一个预定义的" ...

  4. golang中的标准库context解读

    简介 golang 中的创建一个新的 goroutine , 并不会返回像c语言类似的pid,所有我们不能从外部杀死某个goroutine,所有我就得让它自己结束,之前我们用 channel + se ...

  5. golang中的标准库http

    Go语言内置的net/http包十分的优秀,提供了HTTP客户端和服务端的实现. http客户端 基本的HTTP/HTTPS请求 Get.Head.Post和PostForm函数发出HTTP/HTTP ...

  6. golang中的标准库template

    html/template包实现了数据驱动的模板,用于生成可对抗代码注入的安全HTML输出.它提供了和text/template包相同的接口,Go语言中输出HTML的场景都应使用text/templa ...

  7. golang中的标准库IO操作

    参考链接 输入输出的底层原理 终端其实是一个文件,相关实例如下: os.Stdin:标准输入的文件实例,类型为*File os.Stdout:标准输出的文件实例,类型为*File os.Stderr: ...

  8. golang中的标准库反射

    反射 反射是指程序在运行期对程序本身访问和修改的能力 变量的内在机制 变量包含类型信息和值信息 var arr [10]int arr[0] = 10 类型信息:是静态的元信息,是预先定义好的 值信息 ...

  9. golang中的标准库strconv

    strconv 包 strconv包实现了基本数据类型与其字符串表示的转换,主要有以下常用函数: Atoi().Itia().parse系列.format系列.append系列. string与int ...

随机推荐

  1. Java 中的5个代码性能提升技巧,最高提升近10倍

    文章持续更新,可以关注公众号程序猿阿朗或访问未读代码博客. 本文 Github.com/niumoo/JavaNotes 已经收录,欢迎Star. 这篇文章介绍几个 Java 开发中可以进行性能优化的 ...

  2. centos下修改hosts文件以及生效命令

    修改 vim /etc/hosts 生效 service network restart 或者 /etc/init.d/network restart

  3. 【LeetCode】119. 杨辉三角 II Pascal‘s Triangle II(Python & Java)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题思路 方法一: 空间复杂度 O ( k ∗ ( k + 1 ...

  4. 【九度OJ】题目1061:成绩排序 解题报告

    [九度OJ]题目1061:成绩排序 解题报告 标签(空格分隔): 九度OJ [LeetCode] http://ac.jobdu.com/problem.php?pid=1061 题目描述: 有N个学 ...

  5. 【LeetCode】817. Linked List Components 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  6. 修改gorm支持protobuf

    gorm的功能很强大,支持很多很多特性,打算在项目中用上它. 但gorm不支持protobuf,如果idl用的是protobuf,需要对每个message做一个重新定义一个内部的struct,使得可以 ...

  7. TKE 用户故事 - 作业帮 PB 级低成本日志检索服务

    作者 吕亚霖,2019年加入作业帮,作业帮架构研发负责人,在作业帮期间主导了云原生架构演进.推动实施容器化改造.服务治理.GO微服务框架.DevOps的落地实践. 莫仁鹏,2020年加入作业帮,作业帮 ...

  8. electron使用动态配置文件及持久化存储

    1.如何在打包之后,把动态配置文件比如[config.json]放在根目录,不被打包到asar文件中 //解决思路,electron可以拷贝静态资源,比如你把config.json放在项目的根目录下, ...

  9. Two pointer方法

    I.何为Two pointer 用两个哨兵指向两个序列,通过利用序列本身的性质减少遍历次数,来更快得解决一些归并问题 基本问题 给定一个正整数递增序列和一个正整数M,求序列中两个不同位置的a,b使得a ...

  10. JavaScript交互式网页设计 • 【第4章 JavaScript文档对象模型】

    全部章节   >>>> 本章目录 4.1 文档对象模型简介及属性 4.1.1 文档对象模型概述 4.1.3 实践练习 4.2 document 对象查找 HTML 元素 4.2 ...