go时间、定时器与休眠函数(time包)

目录

格式化

时间操作

定时器

时间相关类型

time.Time精确到纳秒的时间点

time.Month一年中的某个月

time.Weekday一周的周几

time.Duration 两个时间点之间经过的纳秒数

Location一个地点及所在的时区信息


time包提供了时间显示和测量相关的函数。包括时间处理与定时器处理(Timer、Ticker、Sleep等)

格式化

go语音中时间格式化非常特别,可简记为‘123456’(月日时分秒年:"2006-01-02 15:04:05.999999999 -0700 MST",15表示24小时制,3表示12小时制(会带AM或PM))

如:time.Now().Format("2006-01-02 15:04:05")

预定义格式:

const (
    ANSIC = "Mon Jan _2 15:04:05 2006"
    UnixDate = "Mon Jan _2 15:04:05 MST 2006"
    RubyDat = "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"
)

时间操作

  • 获取时间

    • Now() // 当前本地时间

    • Unix(sec int64, nsec int64) // 根据时间戳返回本地时间

    • Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) // 返回指定时间

  • 转换与格式化

    • UTC() // 获取指定时间在UTC 时区的时间表示

    • Local() // 以本地时区表示

    • In(loc *Location) // 时间在指定时区的表示

    • Format(layout string) // 按指定格式显示时间

    • Unix() int64:获取Unix格式时间(1970.1.1到现在的秒数)

    • UnixMicro() int64:获取Unix格式时间(1970.1.1到现在的毫秒数)

    • UnixMilli() int64:获取Unix格式时间(1970.1.1到现在的微秒数)

    • UnixNano() int64:获取Unix格式时间(1970.1.1到现在的纳秒数)

  • 比较与计算

    • IsZero() bool {} // 是否是零时时间

    • After(u Time) bool {} // 时间在u之前

    • Before(u Time) bool {} // 时间在u之后

    • Equal(u Time) bool {} // 时间与u相同

    • Add(d Duration) Time {} // 返回t +d 的时间点

    • Sub(u Time) Duration {} // 返回 t-u

    • AddDate(years int, months int, days int) Time {} // 返回增加后的时间点

  • 截断:Truncate(d Duration)
func TimeTraunc() {
	const tmFormat = "2006-01-02 15:04:05.999999"

	t := time.Now()
	fmt.Println("now:", t.Format(tmFormat))
	trunc := []time.Duration{
		time.Microsecond,
		time.Millisecond,
		time.Second,
		time.Minute,
		10 * time.Minute,
		time.Hour,
	}

	for _, d := range trunc {
		fmt.Printf("t.Truncate(%6s) = %s\n", d, t.Truncate(d).Format(tmFormat))
	}

	// To round to the last midnight in the local timezone, create a new Date.
	midnight := time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, time.Local)
	fmt.Println("midnight:", midnight.Format(tmFormat))
}

// Output: 
// now: 2022-12-02 15:14:50.058252
// t.Truncate(   1µs) = 2022-12-02 15:14:50.058252
// t.Truncate(   1ms) = 2022-12-02 15:14:50.058
// t.Truncate(    1s) = 2022-12-02 15:14:50
// t.Truncate(  1m0s) = 2022-12-02 15:14:00
// t.Truncate( 10m0s) = 2022-12-02 15:10:00
// t.Truncate(1h0m0s) = 2022-12-02 15:00:00
// midnight: 2022-12-02 00:00:00

定时器

定时器(Ticker会重复,Timer只执行一次;不需要时都可通过Stop来停止,但若返回的是chan则就无法停止)

  • timer

    • AfterFunc(d Duration, f func()) *Timer:过指定时间后执行f;

    • NewTimer(d Duration) *Timer:可通过reset 重新开始;

    • After(d Duration) <-chan Time:指定时间后触发(若放在select中,则每次重新select都重新计时);

  • ticker

    • NewTicker(d Duration) *Ticker:返回一个只读的channel,定时触发一次,不用时调用Stop停止;

    • Tick(d Duration) <-chan Time:对NewTicker的封装(直接返回了NewTicker.C,可直接读取,但无法停止定时器了);

  • Sleep(d Duration):休眠指定时间

//type Ticker struct {
//	 C <-chan Time //周期性传递时间信息的通道
//	 r runtimeTimer // 定时器相关信息(开始时间、周期、回调、参数等)
//}

func tickTest() {
	ticker := time.NewTicker(5 * time.Second)
	//for _ = range ticker.C {
	//  fmt.Println(time.Now())
	//}
	for {
		select {
		case m := <-ticker.C:
			fmt.Println("Ticker:", m.Format(time.RFC3339))
		case m := <-time.After(10 * time.Second): // 永远没机会执行(每5秒会重新开始)
			fmt.Println("After:", m.Format(time.RFC3339))
		}
	}
}

// Ticker: 2022-12-02T15:44:17+08:00
// Ticker: 2022-12-02T15:44:22+08:00
// Ticker: 2022-12-02T15:44:27+08:00

时间相关类型

时间处理相关的主要数据类型有:time.Time, time.Month, time.Weekday, time.Duration, time.Location等。

time.Time精确到纳秒的时间点

type Time struct {
    sec int64 // 从1年1月1日 00:00:00 UTC 至今过去的秒数
    nsec int32 // 最近一秒到下一秒过去的纳秒数
    loc *Location // 时区
}

time.Month一年中的某个月

type Month int

const (
    January Month = 1 + iota
    February
    March
    April
    May
    June
    July
    August
    September
    October
    November
    December
)

time.Weekday一周的周几

type Weekday int

const (
    Sunday Weekday = iota
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
)

time.Duration 两个时间点之间经过的纳秒数

可表示的最长时间段约为290年

type Duration int64

const (
    Nanosecond  Duration = 1
    Microsecond = 1000 * Nanosecond
    Millisecond = 1000 * Microsecond
    Second  = 1000 * Millisecond
    Minute = 60 * Second
    Hour = 60 * Minute
)

Location一个地点及所在的时区信息

北京时间可以使用 Asia/Shanghai

type Location struct {
    name string
    zone []zone
    tx   []zoneTrans
    cacheStart int64
    cacheEnd   int64
    cacheZone  *zone
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值