返回介绍

上卷 程序设计

中卷 标准库

下卷 运行时

源码剖析

附录

time 1.18

发布于 2024-10-12 19:15:55 字数 3664 浏览 0 评论 0 收藏 0

时间相关概念和辅助函数。

时区

  • 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文