golang时间、时区、格式的使用方法
在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《golang时间、时区、格式的使用方法》,聊聊时区、时间,希望可以帮助到正在努力赚钱的你。
前几天,因为需要实现海外服务端定时停机,涉及到时区的概念。网上搜索了一下,大部分都是谈time.Format中的Layout,非常不成体系,这里就简单总结一下其中的时间初始化、时区转化及格式转换。
开发中,我们对时间的使用是比较多的,其应用场景,按照使用概率,从大到小,通常是:
- 获取当前或数据库中存储的时间
- 比较两个时间点的先后
- 显示打印时间
- 时区转换
对应到go,也就是几个基本定义:
- 时间点与时间段:Time,Duration。好比MVC中的M。
- 时 区:Location,在时间转换上,好比是MVC中的C。
- 格式化:Format的layout定义,好比MVC中的V。
单独就Duration没什么好谈的,使用非常简单。Time实例中的Add、Sub与其相关,非常容易上手,就不再多说。
时区
时区是时间运算非常重要的概念,特别强调与layout是两个完全不同的概念。go语言通过Location来作为时区的运行实例,同一时刻转换成为不同的时区,就需要通过不同的Location来进行。默认情况下,采用UTC(unix标准时间),而不是过去式的GMT(格林尼治标准时间)。
以下代码展示了UTC标准、北京、美国洛杉矶在同一时刻的转换:
now := time.Now()
local1, err1 := time.LoadLocation("") //等同于"UTC"
if err1 != nil {
fmt.Println(err1)
}
local2, err2 := time.LoadLocation("Local")//服务器设置的时区
if err2 != nil {
fmt.Println(err2)
}
local3, err3 := time.LoadLocation("America/Los_Angeles")
if err3 != nil {
fmt.Println(err3)
}
fmt.Println(now.In(local1))
fmt.Println(now.In(local2))
fmt.Println(now.In(local3))
//output:
//2016-12-04 07:39:06.270473069 +0000 UTC
//2016-12-04 15:39:06.270473069 +0800 CST
//2016-12-03 23:39:06.270473069 -0800 PST
代码中,LoadLocation的输入参数的取值,除了该函数的源代码中可看到的”UTC”、”Local”,其余的值其实是遵照“IANA Time Zone”的规则,可以解压$GOROOT/lib/time/zoneinfo.zip 这个文件打开查看。在Asia这个目录,我看到了Chongqing,Hong_Kong,但没Beijing。在国外获取中国北京时间,要用”PRC”,当然”Asia/Chongqing”也是个方法:
loc, _:= time.LoadLocation("Asia/Chongqing") //参数就是解压文件的“目录”+“/”+“文件名”。
fmt.Println(time.Now().In(loc))
值得强调的是,Location仅用于时区转化,而不对time内部的数据产生影响(内部其实是unix标准时),因此,当几个time实例进行Add、Sub的时候,不用关注Location是否相同。
时间格式化
前面例子中,打印结果非常丑陋,通常没人关心秒之后的ns;明确时区后,很少需要与UTC的时差。这时候,就需要定义我们的layout了。
网上好多都说,“2006-01-02 15:04:05是go的诞生时间,所以这么设计Format的Layout”,应该不是真的。请看下表:
| 01/Jan | 02 | 03/15 | 04 | 05 | 06 | -07[00][:00] | PM | Mon |
|---|---|---|---|---|---|---|---|---|
| 月 | 日 | 时 | 分 | 秒 | 年 | 时差 | 上下午 | 星期几 |
也就是1234567,分别对应:月日时分秒年 时差,很好记忆。只是稍微注意一下:
- 月:01或Jan都可以
- 小时:03表示12小时制,15表示24小时制。
- 时差:是 -07 ,不是 07,后边可以增加“00”或“:00”,表示更进一步的分秒时差。
- 上下午:使用PM,不是AM。
- 摆放顺序:随意,甚至重复都可以。源代码包也有定义的常用格式供使用。
也许是因为06对应的“年”与go的项目启动时间差不多,也就有了网上的误传。在源代码time/time.go中,有非常明确的描述,粘贴一下,就不翻译了:
// These are predefined layouts for use in Time.Format and Time.Parse.
// The reference time used in the layouts is the specific time:
// Mon Jan 2 15:04:05 MST 2006
// which is Unix time 1136239445. Since MST is GMT-0700,
// the reference time can be thought of as
// 01/02 03:04:05PM ‘06 -0700
虽然go已经提供了10多个常用格式:
const ( 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 zone RFC850 = "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 zone RFC3339 = "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" )
但个人习惯还是“2006-01-02 15:04:05 Mon”,之前代码稍加修改,就是这样:
formate:="2006-01-02 15:04:05 Mon"
now := time.Now()
local1, err1 := time.LoadLocation("UTC") //输入参数"UTC",等同于""
if err1 != nil {
fmt.Println(err1)
}
local2, err2 := time.LoadLocation("Local")
if err2 != nil {
fmt.Println(err2)
}
local3, err3 := time.LoadLocation("America/Los_Angeles")
if err3 != nil {
fmt.Println(err3)
}
fmt.Println(now.In(local1).Format(formate))
fmt.Println(now.In(local2).Format(formate))
fmt.Println(now.In(local3).Format(formate))
//output:
//2016-12-04 08:06:39 Sun
//2016-12-04 16:06:39 Sun
//2016-12-04 00:06:39 Sun
时间初始化
除了最常用的time.Now,go还提供了通过unix标准时间、字符串两种方式来初始化:
//通过字符串,默认UTC时区初始化Time func Parse(layout, value string) (Time, error) //通过字符串,指定时区来初始化Time func ParseInLocation(layout, value string, loc *Location) (Time, error) //通过unix 标准时间初始化Time func Unix(sec int64, nsec int64) Time
时间初始化的时候,一定要注意原始输入值的时区。正好手里有一个变量,洛杉矶当地时间“2016-11-28 19:36:25”,unix时间精确到秒为1480390585。将其解析出来的代码如下:
local, _ := time.LoadLocation("America/Los_Angeles")
timeFormat := "2006-01-02 15:04:05"
//func Unix(sec int64, nsec int64) Time {
time1 := time.Unix(1480390585, 0) //通过unix标准时间的秒,纳秒设置时间
time2, _ := time.ParseInLocation(timeFormat, "2016-11-28 19:36:25", local) //洛杉矶时间
fmt.Println(time1.In(local).Format(timeFormat))
fmt.Println(time2.In(local).Format(timeFormat))
chinaLocal, _ := time.LoadLocation("Local")//运行时,该服务器必须设置为中国时区,否则最好是采用"Asia/Chongqing"之类具体的参数。
fmt.Println(time2.In(chinaLocal).Format(timeFormat))
//output:
//2016-11-28 19:36:25
//2016-11-28 19:36:25
//2016-11-29 11:36:25
当然,如果输入值是字符串,且带有时区
“2016-12-04 15:39:06 +0800 CST”
则不需要采用ParseInLocation方法,直接使用Parse即可。
当然,其他time包中的函数还有很多,但网上已经有很多描述,就不再啰嗦。
终于介绍完啦!小伙伴们,这篇关于《golang时间、时区、格式的使用方法》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!
golang time包的用法详解
- 上一篇
- golang time包的用法详解
- 下一篇
- Go JSON编码与解码的实现
-
- Golang · Go教程 | 4小时前 | Go教程 · Go 日志级别 log/slog slog.Handler LevelVar HandlerOptions.Level Enabled
- Go log/slog 怎样让 Handler 过滤低级别日志
- 272浏览 收藏
-
- Golang · Go教程 | 4小时前 | 日志 · 标准库 · go · Go 结构化日志 ReplaceAttr log/slog HandlerOptions
- Go log/slog ReplaceAttr 怎样统一改写时间和来源字段
- 333浏览 收藏
-
- Golang · Go教程 | 4小时前 |
- Go log/slog 怎样为 slog 添加请求上下文字段
- 252浏览 收藏
-
- Golang · Go教程 | 4小时前 | 错误处理 · Go教程 · database/sql · Go commit 事务 rollback database/sql sql.Tx BeginTx
- Go database/sql 怎样让事务回滚覆盖提前返回路径
- 249浏览 收藏
-
- Golang · Go教程 | 4小时前 | go · 数据库 · Go database/sql ColumnType Rows.ColumnTypes
- Go database/sql 怎样用 RowsColumnTypes 获取列元数据
- 171浏览 收藏
-
- Golang · Go教程 | 4小时前 | Go教程 · database/sql · Go database/sql rows.Next Rows.Scan sql.RawBytes 二进制字段
- Go sql.RawBytes 为什么只能在下一次 Next 前使用
- 159浏览 收藏
-
- Golang · Go教程 | 4小时前 |
- Go reflect 怎样区分 IsZero 和无效反射值
- 477浏览 收藏
-
- Golang · Go教程 | 4小时前 |
- Go reflect 怎样判断反射值是否可寻址
- 485浏览 收藏
-
- Golang · Go教程 | 4小时前 |
- Go reflect 怎样用 StructOf 构造临时结构体
- 335浏览 收藏
-
- Golang · Go教程 | 4小时前 |
- Go runtime 怎样读取进程内存统计快照
- 366浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 521次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 578次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 604次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 554次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 373次使用
-
- Go中时间与时区问题的深入讲解
- 2023-01-09 120浏览
-
- 一文搞懂Golang时间和日期相关函数
- 2022-12-29 143浏览
-
- Go每日一库之dateparse处理时间
- 2023-01-19 367浏览
-
- golang 实现时间戳和时间的转化
- 2023-01-25 145浏览
-
- 解决Golang time.Parse和time.Format的时区问题
- 2023-02-21 114浏览
