func Sleep(d Duration) 睡眠
func After(d Duration) <-chan Time
After会在另一线程经过时间段d后向返回值发送当时的时间。等价于NewTimer(d).C。
for{
select {
case m := <-c:
handle(m)
case <-time.After(5 * time.Minute):
fmt.Println("timed out")
}
}
for+select + time.After有坑,在case不到的情况下,首先一直创建,由于case不到,被遗弃的time.After定时任务还是在时间堆里面,定时任务未到期之前,是不会被gc清理的
//使用 time.NewTimer 替代
func useNewTimer(in <-chan string) {
defer wg.Done()
idleDuration := 3 * time.Minute
idleDelay := time.NewTimer(idleDuration)
defer func() {
if !idleDelay.Stop() {
<-idleDelay.C
}
}()
for Running {
idleDelay.Reset(idleDuration)
select {
case _, ok := <-in:
if !ok {
return
}
// handle `s`
case <-idleDelay.C:
return
}
}
}
func Tick(d Duration) <-chan Time
- Tick是NewTicker的封装,只提供对Ticker的通道的访问。如果不需要关闭Ticker,本函数就很方便。
c := time.Tick(1 * time.Minute)
for now := range c {
fmt.Printf("%v %s\n", now)
}
日期格式
const (
ANSIC = "Mon Jan _2 15:04:05 2006"
UnixDate = "Mon Jan _2 15:04:05 MST 2006"
RubyDate = "Mon Jan 02 15:04:05 -0700 2006"
RFC822 = "02 Jan 06 15:04 MST"
RFC822Z = "02 Jan 06 15:04 -0700" // 使用数字表示时区的RFC822
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
RFC3339 = "2006-01-02T15:04:05Z07:00"
RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
Kitchen = "3:04PM"
// 方便的时间戳
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"
)
type Weekday
-
type Month
-
type Location
time.UTC :utc时间
-
type Time
时间类型,包含了秒和纳秒以及Location
func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time 返回year-month-day hour:min:sec + nsec nanoseconds
func Now() Time 2019-03-16 20:29:09.7733268 +0800 CST m=+0.002991301
func Unix(sec int64, nsec int64) Time 从January 1, 1970 UTC至该时间的秒数和纳秒数
func Parse(layout, value string) (Time, error) 按layout给出的格式,解析value
func ParseInLocation(layout, value string, loc *Location) (Time, error)
const shortForm = "2006-Jan-02"
t, _ = time.ParseInLocation(shortForm, "2012-Jul-09", loc)
fmt.Println(t)
2012-07-09 00:00:00 +0200 CEST
func (t Time) Location() *Location 返回t的地点和时区信息。
func (t Time) Local() Time 返回本地时区的时间
func (t Time) UTC() Time 返回UTC时区的时间
func (t Time) Unix() int64 从时间点January 1, 1970 UTC到时间点t所经过的时间(单位秒)
func (t Time) UnixNano() int64 从时间点January 1, 1970 UTC到时间点t所经过的时间(单位纳秒)
func (t Time) Before(u Time) bool 如果t代表的时间点在u之前,返回真;否则返回假。
func (t Time) After(u Time) bool 如果t代表的时间点在u之后,返回真;否则返回假。
func (t Time) Date() (year int, month Month, day int) 返回时间点t对应的年、月、日。
func (t Time) Clock() (hour, min, sec int) 返回t对应的那一天的时、分、秒。
func (t Time) Year() int 返回时间点t对应的年份
func (t Time) Month() Month 返回时间点t对应那一年的第几月
func (t Time) ISOWeek() (year, week int) 一年中的第多少个星期,星期编号范围[1,53],1月1号到1月3号可能属于上一年的最后一周,12月29号到12月31号可能属于下一年的第一周。
func (t Time) YearDay() int 返回时间点t对应的那一年的第几天,平年的返回值范围[1,365],闰年[1,366]
func (t Time) Day() int 返回时间点t对应那一月的第几日
func (t Time) Weekday() Weekday 返回时间点t对应的那一周的周几
func (t Time) Hour() int 返回t对应的那一天的第几小时,范围[0, 23]
func (t Time) Minute() int 返回t对应的那一小时的第几分种,范围[0, 59]
func (t Time) Second() int 返回t对应的那一分钟的第几秒,范围[0, 59]
func (t Time) Nanosecond() int 返回t对应的那一秒内的纳秒偏移量,范围[0, 999999999]
func (t Time) Add(d Duration) Time Add返回时间点t+d。
func (t Time) AddDate(years int, months int, days int) Time
- AddDate返回增加了给出的年份、月份和天数的时间点Time。
func (t Time) Sub(u Time) Duration 返回一个时间段t-u。如果结果超出了Duration可以表示的最大值/最小值,将返回最大值/最小值。要获取时间点t-d(d为Duration),可以使用t.Add(-d)。
func (t Time) Format(layout string) string
- fmt.Println(time.Now().Format(“2006-01-02 15:04:05”)),这是个奇葩,必须是这个时间点
- fmt.Println(time.Now().Format(“2006-01-02 15:04:05.999999999”)),这是个奇葩,必须是这个时间点
- String返回采用如下格式字符串的格式化时间。”2006-01-02 15:04:05.999999999 -0700 MST”
func (t Time) GobEncode() ([]byte, error) 编码为gob
func (t Time) GobDecode(data []byte) error 从gob解码
func (t Time) MarshalBinary() ([]byte, error) 编码为Binary
func (t Time) UnmarshalBinary(data []byte) error 解码为Binary
func (t Time) MarshalJSON() ([]byte, error) 编码为json
func (t *Time) UnmarshalJSON(data []byte) (err error) 解码为json
type Duration
Duration类型代表两个时间点之间经过的时间,以纳秒为单位。可表示的最长时间段大约290年。
const (
Nanosecond Duration = 1
Microsecond = 1000 * Nanosecond
Millisecond = 1000 * Microsecond
Second = 1000 * Millisecond
Minute = 60 * Second
Hour = 60 * Minute
)
func ParseDuration(s string) (Duration, error)
- ParseDuration解析一个时间段字符串。一个时间段字符串是一个序列,每个片段包含可选的正负号、十进制数、可选的小数部分和单位后缀,如”300ms”、”-1.5h”、”2h45m”。合法的单位有”ns”、”us” /“µs”、”ms”、”s”、”m”、”h”。
func Since(t Time) Duration Since返回从t到现在经过的时间,等价于time.Now().Sub(t)。
func (d Duration) Hours() float64
func (d Duration) Minutes() float64
func (d Duration) Seconds() float64
func (d Duration) Nanoseconds() int64
func (d Duration) String() string
- 返回时间段采用”72h3m0.5s”格式的字符串表示。最前面可以有符号,数字+单位为一个单元,开始部分的0值单元会被省略;
- 如果时间段<1s,会使用”ms”、”us”、”ns”来保证第一个单元的数字不是0;如果时间段为0,会返回”0”。
type Timer(单次)
Timer类型代表单次时间事件。当Timer到期时,当时的时间会被发送给C,除非Timer是被AfterFunc函数创建的。
type Timer struct {
C <-chan Time
// 内含隐藏或非导出字段
}
func NewTimer(d Duration) *Timer
- NewTimer创建一个Timer,它会在最少过去时间段d后到期,向其自身的C字段发送当时的时间。
func AfterFunc(d Duration, f func()) *Timer
- AfterFunc另起一个go程等待时间段d过去,然后调用f。它返回一个Timer,可以通过调用其Stop方法来取消等待和对f的调用。
func (t *Timer) Reset(d Duration) bool
- Reset使t重新开始计时,(本方法返回后再)等待时间段d过去后到期。如果调用时t还在等待中会返回真;如果t已经到期或者被停止了会返回假。
- Stop停止Timer的执行。如果停止了t会返回真;如果t已经被停止或者过期了会返回假。Stop不会关闭通道t.C
type Ticker(循环)
Ticker保管一个通道,并每隔一段时间向其传递”tick”。
type Ticker struct {
C <-chan Time // 周期性传递时间信息的通道
// 内含隐藏或非导出字段
}
func NewTicker(d Duration) *Ticker
- NewTicker返回一个新的Ticker,该Ticker包含一个通道字段
func (t *Ticker) Stop()
- Stop关闭一个Ticker。在关闭后,将不会发送更多的tick信息。Stop不会关闭通道t.C,以避免从该通道的读取不正确的成功。
func (t *Ticker) Reset(d Duration) 重置Ticker
时区问题
在Go语言上,go语言的time.Now()返回的是当地时区时间,直接用:
time.Now().Format("2006-01-02 15:04:05")
• 1
输出的是当地时区时间。
go语言并没有全局设置时区这么一个东西,每次输出时间都需要调用一个In()函数改变时区:
var cstSh, _ = time.LoadLocation("Asia/Shanghai") //上海
fmt.Println("SH : ", time.Now().In(cstSh).Format("2006-01-02 15:04:05"))
• 1
• 2
在windows系统上,没有安装go语言环境的情况下,time.LoadLocation会加载失败。
var cstZone = time.FixedZone("CST", 8*3600) // 东八
fmt.Println("SH : ", time.Now().In(cstZone).Format("2006-01-02 15:04:05"))
最好的办法是用time.FixedZone