[Go关于时间] time库/扩展now库
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Go关于时间] time库/扩展now库相关的知识,希望对你有一定的参考价值。
文章目录
Time库
Time对象
Go
语言中使用time.Time
类表示时间
可以由这个对象获取到年、月、日、时、分、秒等信息
func timeDemo()
now := time.Now() // 获取当前时间
fmt.Printf("current time:%v\\n", now)
year := now.Year() // 年
month := now.Month() // 月
day := now.Day() // 日
hour := now.Hour() // 小时
minute := now.Minute() // 分钟
second := now.Second() // 秒
fmt.Println(year, month, day, hour, minute, second)
时区概念
除了上面直接用time.Now()
获取当前时间,也可以自己创建时间
func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time
最后一个参数是时区,表示的是不同地区的时间定义(因为有时差的概念)
创建时区也有一个函数,其中name
为时区名字,offset
为时差的偏移量
func FixedZone(name string, offset int) *Location
一个小例子
func timeDemo()
secondsEastOfUTC := int((8 * time.Hour).Seconds())
// FixedZone 返回始终使用给定区域名称和偏移量(UTC 以东秒)的 Location。
beijing := time.FixedZone("Beijing Time", secondsEastOfUTC)
newYork, err := time.LoadLocation("America/New_York") // UTC-05:00
if err != nil
fmt.Println("load America/New_York location failed", err)
return
timeInUTC := time.Date(2009, 1, 1, 12, 0, 0, 0, time.UTC)
sameTimeInBeijing := time.Date(2009, 1, 1, 20, 0, 0, 0, beijing)
sameTimeInNewYork := time.Date(2009, 1, 1, 7, 0, 0, 0, newYork)
// 北京时间(东八区)比UTC早8小时,所以上面两个时间看似差了8小时,但表示的是同一个时间
timesAreEqual := timeInUTC.Equal(sameTimeInBeijing)
fmt.Println(timesAreEqual)
// 纽约(西五区)比UTC晚5小时,所以上面两个时间看似差了5小时,但表示的是同一个时间
timesAreEqual = timeInUTC.Equal(sameTimeInNewYork)
fmt.Println(timesAreEqual)
Unix Time
Unix Time
是自1970年1月1日 00:00:00 UTC 至当前时间经过的总秒数。
下面的代码片段演示了如何基于时间对象获取到Unix 时间。
func timeDemo()
now := time.Now() // 获取当前时间
timestamp := now.Unix() // 秒级时间戳
fmt.Println(timestamp)
反过来将int64
的时间戳转化为时间对象
func timeDemo()
sec := time.Now().Unix()
// 将秒级时间戳转为时间对象(第二个参数为不足1秒的纳秒数)
timeObj := time.Unix(sec, 22)
fmt.Println(timeObj)
时间间隔,加减法
关于时间的运算都是以time.Duration
类型(纳秒)为最小单位的
一下是time
库中的常量定义
const (
Nanosecond Duration = 1
Microsecond = 1000 * Nanosecond
Millisecond = 1000 * Microsecond
Second = 1000 * Millisecond
Minute = 60 * Second
Hour = 60 * Minute
)
Add
方法
func (t Time) Add(d Duration) Time
func timeDemo()
now := time.Now()
fmt.Println( now )
var MyHour time.Duration = 1000*1000*1000*60*60; //纳秒转小时
later := now.Add( MyHour ) // 当前时间加1小时后的时间
fmt.Println(later)
Sub
方法
求两个时间的差值
func (t Time) Sub(u Time) Duration
func timeDemo()
sub := time.Now()
var MyHour time.Duration = 1000*1000*1000*60*60;
subed := sub.Add( MyHour )
fmt.Println( sub,subed )
fmt.Println( "差值为 = ",sub.Sub(subed) )
其他的一些函数
func (t Time) Equal(u Time) bool //比较时间是否相同,会考虑时区的影响 func (t Time) Before(u Time) bool //若t时间在u前面返回真,否则假 func (t Time) After(u Time) bool //和上面相反
定时器
本质上是一个time
类型的chan
信道,每到设定的间隔就会发送一个当前时间进来
func timeDemo()
ticker := time.Tick(time.Second) //定义一个1秒间隔的定时器
for i := range ticker
fmt.Println(i)//每秒都会执行的任务
格式化时间
有时候需要不同格式的时间输出,就可以使用Format
这个函数
参数是需要设置的格式,格式化的模板必须是2006-01-02 15:04:05
当然什么格式可以自行调整
func timeDemo()
now := time.Now()
// 格式化的模板为 2006-01-02 15:04:05 简单记忆为2006 1 2 3 4 5
// 24小时制
fmt.Println(now.Format("2006-01-02 15:04:05.000 Mon Jan"))
// 12小时制
fmt.Println(now.Format("2006-01-02 03:04:05.000 PM Mon Jan")) //pm表示下午
// 小数点后写0,因为有3个0所以格式化输出的结果也保留3位小数
fmt.Println(now.Format("2006/01/02 15:04:05.000")) // 2022/02/27 00:10:42.960
// 小数点后写9,会省略末尾可能出现的0
fmt.Println(now.Format("2006/01/02 15:04:05.999")) // 2022/02/27 00:10:42.96
// 只格式化时分秒部分
fmt.Println(now.Format("15:04:05"))
// 只格式化日期部分
fmt.Println(now.Format("2006.01.02"))
从字符串中解析时间
实际上就是上面的反过程,使用time.Parse
函数完成
func timeDemo()
// 在没有时区指示符的情况下,time.Parse 返回UTC时间
timeObj, err := time.Parse("2006-01-02 15:04:05.000", "2022-03-24 16:01:09.560")
if err != nil
fmt.Println(err)
return
fmt.Println(timeObj) // 2022-10-05 11:25:20 +0000 UTC
// 在有时区指示符的情况下,time.Parse 返回对应时区的时间表示
// RFC3339 = "2006-01-02T15:04:05Z07:00"
timeObj, err = time.Parse(time.RFC3339, "2022-10-05T11:25:20+08:00")
if err != nil
fmt.Println(err)
return
fmt.Println(timeObj) // 2022-10-05 11:25:20 +0800 CST
jinzhu/now库
也是用来处理时间的一个组件
优化time.Parse
time
库中解析字符串2022-03-24
和字符串2022/03/24
需要两种不同的模板
而使用now
可以简化这个过程, 非常方便,自动识别格式
func timeDemo()
t, _ := now.Parse("2017/01/02")
fmt.Println(t)
t2, _ := now.Parse("2017-10-02 17:30")
fmt.Println(t2)
以上是关于[Go关于时间] time库/扩展now库的主要内容,如果未能解决你的问题,请参考以下文章