时间 golang的time包

本文深入探讨了时间戳的概念及其在不同时区的应用,详细讲解了如何使用ParseInLocation进行时间格式转换,避免了常见的Unix时间陷阱,并介绍了时间戳与time类型之间的转换方法,以及如何利用timeticker实现定时任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先

【时间戳】

定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。因此,严格来说,不管你处在地球上的哪个地方,任意时间点的时间戳都是相同的。这点有利于线上和客户端分布式应用统一追踪时间信息。但是不同的时区,当前时间戳对应的当前时间是不同的。

【ParseInLocation】字符串转时间类型时要使用ParseInLocation而不是Parse

ParseInLocation类似Parse但有两个重要的不同之处。第一,当缺少时区信息时,Parse将时间解释为UTC时间,而ParseInLocation将返回值的Location设置为loc;第二,当时间字符串提供了时区偏移量信息时,Parse会尝试去匹配本地时区,而ParseInLocation会去匹配loc。

loc, _ := time.LoadLocation("Europe/Berlin")
const longForm = "Jan 2, 2006 at 3:04pm (MST)"
t, _ := time.ParseInLocation(longForm, "Jul 9, 2012 at 5:02am (CEST)", loc)
fmt.Println(t)
// Note: without explicit zone, returns time in given location.
const shortForm = "2006-Jan-02"
t, _ = time.ParseInLocation(shortForm, "2012-Jul-09", loc)
fmt.Println(t)

【Unix】

Unix创建一个本地时间,对应sec和nsec表示的Unix时间(从January 1, 1970 UTC至该时间的秒数和纳秒数)。nsec的值在[0, 999999999]范围外是合法的。

timeV := time.Unix(timestampV, 0)

Unix的一个坑:

type S1 struct {
	F1 time.Time
}

func main() {
	s1 := &S1{} // F1 = 0001-01-01 00:00:00 +0000
	s1Ts := s1.F1.Unix() // -62135596800 不符合预期

	s2 := time.Unix(0, 0)
	s2Ts := s2.Unix() // 0 符合预期
}

time类型 和 时间戳 的转换

timestamp := time.Now().Unix()  //timestamp为时间戳类型

tm := time.Unix(timestamp, 0)  //tm为Time类型

时间戳或time类型 转 字符串(格式化)

tm := time.Now() //tm为Time类型

timestamp := time.Now().Unix() //timestamp为时间戳类型

time.Now().String()  //没有格式化

fmt.Println(tm.Format("2006-01-02 03:04:05 PM"))  //格式化
fmt.Println(tm.Format("02/01/2006 15:04:05 PM"))  //24小时制

也可以直接输出  fmt.Println(time.Now())  output:2017-02-27 01:20:00.567634365 +0800 CST

指定时间的time类型  time.Date(2017, 02, 27, 20, 20, 20, 20, time.Local)

字符串 转 time类型或时间戳

x := "2017-02-27 17:30:20"
p, _ := time.Parse("2006-01-02 15:04:05", x)  //p为time类型
p.Unix() //p.Unix()为时间戳类型

time ticker

func main() {
    ticker := time.NewTicker(10 * time.Second)
    for i := 0; i < 10; i++ {
        time := <-ticker.C
        fmt.Println(time.String())
    }
}

输出:

2015-08-24 16:22:23.590564088 +0800 CST

2015-08-24 16:22:33.591194618 +0800 CST

2015-08-24 16:22:43.587720967 +0800 CST

2015-08-24 16:22:53.590231413 +0800 CST

2015-08-24 16:23:03.591164202 +0800 CST

ticket是一个只读的chanel。

go和其他语言的开发思路不一样。其他语言,多是注册回调函数,定时,时间到了调用回调。go是 通过 chan的阻塞实现的。

调用的地方,读取chan 。定时,时间到,向chan写入值,阻塞解除,调用函数。 

Duration

"持续时间"  https://studygolang.com/articles/12617

时间的加减

// 一天前
	d, _ := time.ParseDuration("-24h")
	d1 := now.Add(d)
	fmt.Println(d1)
更多:https://studygolang.com/articles/8919

更多

package time  https://studygolang.com/pkgdoc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值