上卷 程序设计
中卷 标准库
- bufio 1.18
- bytes 1.18
- io 1.18
- container 1.18
- encoding 1.18
- crypto 1.18
- hash 1.18
- index 1.18
- sort 1.18
- context 1.18
- database 1.18
- connection
- query
- queryrow
- exec
- prepare
- transaction
- scan & null
- context
- tcp
- udp
- http
- server
- handler
- client
- h2、tls
- url
- rpc
- exec
- signal
- embed 1.18
- plugin 1.18
- reflect 1.18
- runtime 1.18
- KeepAlived
- ReadMemStats
- SetFinalizer
- Stack
- sync 1.18
- atomic
- mutex
- rwmutex
- waitgroup
- cond
- once
- map
- pool
- copycheck
- nocopy
- unsafe 1.18
- fmt 1.18
- log 1.18
- math 1.18
- time 1.18
- timer
下卷 运行时
源码剖析
附录
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
time 1.18
时间相关概念和辅助函数。
时区
GMT
: 格林尼治标准时间。UTC
: 世界协调时间。DST
: 夏日节约时间(夏令时)。CST
: 表示包含中国北京时间在内的时区,等于 UTC+8。
GMT 是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义为通过那里的经线。但由于地球每天自转有些不规则,且正在缓慢减速,因此 GMT 已不再作为标准时间使用。现行标准时间,是由原子钟报时的协调世界时(UTC)。
UTC 误差必须保持在 0.9 秒以内。由位于巴黎的国际地球自转事务中央局负责修正,使其与地球自转周期一致,所以是更为精确的世界时间标准。
标准库定义两个时区,分别对应本地系统时间和 UTC 时间。
var Local *Location = &localLoc var UTC *Location = &utcLoc
func main() { d := time.Date(2022, 7, 1, 13, 56, 24, 0, time.UTC) fmt.Println(d) // 2022-07-01 13:56:24 +0000 UTC fmt.Println(d.Local()) // 2022-07-01 21:56:24 +0800 CST fmt.Println(d.UTC()) // 2022-07-01 13:56:24 +0000 UTC // 时区转换,区分大小写。 loc, _ := time.LoadLocation("Asia/Shanghai") t := d.In(loc) fmt.Println(t.Location()) // Asia/Shanghai fmt.Println(t.Zone()) // CST 28800 // 比较时间时,会考虑时区。 fmt.Println(d == t) // false fmt.Println(d.Equal(t)) // true t = t.AddDate(0, 0, 1) fmt.Println(d.Before(t)) // true fmt.Println(d.After(t)) // false }
Duration
纳秒精度的时间段。
type Duration int64 const ( Nanosecond Duration = 1 // 纳秒 ns Microsecond = 1000 * Nanosecond // 微妙 us Millisecond = 1000 * Microsecond // 毫秒 ms Second = 1000 * Millisecond Minute = 60 * Second Hour = 60 * Minute )
func main() { d, _ := time.ParseDuration("1h2m3s100us") fmt.Println(d) d, _ = time.ParseDuration("1us1ns") fmt.Println(d.Nanoseconds()) // 1001 }
Time
纳秒精度的时间。
Date
:按参数构造。Now
:当前系统本地时间。Parse
:按指定格式解析字符串。Unix
:基于1970-01-01 UTC
的时间差,返回本地时间。
方法:
IsZero
:判断未赋值的时间。Date, Clock
:返回时间各部分。(年月日时分秒)Equal
:时间是否相等。(自动处理时区)。After, Before
:之前或之后Unix
:自1970-1-1 00:00:00 UTC
开始到现在的秒数。UnixNano
:纳秒。
func main() { var t time.Time fmt.Println(t.IsZero()) // true t = time.Date(2022, 7, 2, 0, 0, 0, 0, time.Local) fmt.Println(t.IsZero()) // false fmt.Println(t.Unix()) // 1656691200 fmt.Println(t.UnixNano()) // 1656691200000000000 }
格式化输出。
RFC3339 = "2006-01-02T15:04:05Z07:00"
func main() { t := time.Date(2022, 7, 2, 13, 3, 9, 0, time.Local) fmt.Println(t.Format("2006-01-02 15:04:05 -0700 MST")) fmt.Println(t.Format("2006-01-02 15:04:05")) fmt.Println(t.Format("06-1-2 3:4:5PM")) } // 2022-07-02 13:03:09 +0800 CST // 2022-07-02 13:03:09 // 22-7-2 1:3:9PM
Timer
定时器核心由运行时实现,因为要配合调度器工作。
Timer
: 单次事件。Ticker
: 周期事件。
func main() { t := time.NewTimer(time.Second) fmt.Println(<-t.C) c := time.After(time.Second) fmt.Println(<-c) // ------------------------- var wg sync.WaitGroup wg.Add(1) time.AfterFunc(time.Second*3, func() { // goroutine defer wg.Done() println("afterfunc.") }) wg.Wait() println("done.") } /* 2022-07-02 23:38:39 2022-07-02 23:38:40 afterfunc. done. */
周期性事件按间隔时间重复触发。
func main() { t := time.NewTicker(time.Second * 2) defer t.Stop() // !!!!!! for i := 0; i < 10; i++ { fmt.Println(<- t.C) } } /* 2022-07-02 23:47:46 2022-07-02 23:47:48 2022-07-02 23:47:50 */
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论