Contents

go标准库-Time

go语言中文网

godoc

go语言中文网有很多文档缺少内容比如string.Builder就没有,godoc绝对详尽,推荐阅读godoc

time包提供了时间的显示和测量用的函数。日历的计算采用的是公历

函数

  • func Sleep(d Duration): 阻塞当前go程至少d代表的时间段
  • func After(d Duration) <-chan Time: 在另一线程经过时间段d后向返回值发送当时的时间

type Weekday int

常量

1
2
3
4
5
6
7
8
9
const (
    Sunday Weekday = iota
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
)

函数

  • func (d Weekday) String() string: String返回该日(周几)的英文名

type Month int

常量

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
const (
    January Month = 1 + iota
    February
    March
    April
    May
    June
    July
    August
    September
    October
    November
    December
)

函数

  • func (m Month) String() string: String返回月份的英文名

type Location struct

Location代表一个(关联到某个时间点的)地点,以及该地点所在的时区

函数

  • func LoadLocation(name string) (*Location, error): 返回使用给定的地名创建的Location,可用的名字有UTC,Local或者IANA时区数据库里有记录的地点名如"America/New_York"
  • func FixedZone(name string, offset int) *Location: 使用给定的地点名name和时间偏移量offset(单位秒)创建并返回一个Location
  • func (l *Location) String() string: 返回值绑定为LoadLocation或FixedZone函数创建l时的name参数

type Time struct

纳秒精度的时间点

函数

  • func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time:返回一个根据参数设置值的Time对象
  • func Now() Time:当前本地时间的Time对象
  • func Unix(sec int64, nsec int64) Time:使用Unix时间戳创建一个Time对象

方法

  • func (t Time) Location() *Location: 返回t的Location对象
  • func (t Time) Zone() (name string, offset int): 计算t所在的时区,返回该时区的规范名(如"CET")和该时区相对于UTC的时间偏移量(单位秒)
  • func (t Time) Local() Time: 返回采用本地和本地时区,但指向同一时间点的Time
  • func (t Time) UTC() Time: 返回UTC零时区,但指向同一时间点的Time
  • func (t Time) Unix() int64: 返回t表示时间的Unix时间戳,单位为秒
  • func (t Time) UnixNano() int64: 返回t表示时间的Unix时间戳,单位为纳秒
  • func (t Time) Equal(u Time) bool: 判断两个时间是否相同,会考虑时区的影响,因此不同时区标准的时间也可以正确比较。==不比较地区和对应时区信息
  • func (t Time) Before(u Time) bool: t是否在u之后
  • func (t Time) After(u Time) bool: t是否在u之前
  • func (t Time) In(loc *Location) Time: 将当前时间转换为loc所在的时间,返回新的Time

  • func (t Time) Date() (year int, month Month, day int): 返回年、月、日
  • func (t Time) Clock() (hour, min, sec int): 返回时、分、秒
  • func (t Time) Year() int:返回年
  • func (t Time) Month() Month:返回月
  • func (t Time) YearDay() int: t对应的那一年的第几天
  • func (t Time) Day() int: 返回日
  • func (t Time) Weekday() Weekday: 返回是周几
  • func (t Time) Hour() int:返回时
  • func (t Time) Minute() int:返回分
  • func (t Time) Second() int:返回秒
  • func (t Time) Nanosecond() int: 返回纳秒

  • func (t Time) Add(d Duration) Time: 返回时间点t+d

  • func (t Time) Sub(u Time) Duration: 返回时间段t-u

  • func (t Time) Truncate(d Duration) Time: 按d时间长度截断t,只能按照UTC截断

  • func (t Time) Format(layout string) string: 根据layout指定的格式返回t代表的时间点的格式化文本表示,格式为Mon Jan 2 15:04:05 -0700 MST 2006

  • func Parse(layout, value string) (Time, error): Parse解析一个格式化的时间字符串并返回它代表的时间。layout定义了参考时间:Mon Jan 2 15:04:05 -0700 MST 2006。如果时区缩写是"UTC",会将该时间视为UTC时间,不考虑Location

type Duration int64

常量

1
2
3
4
5
6
7
8
const (
    Nanosecond  Duration = 1
    Microsecond          = 1000 * Nanosecond
    Millisecond          = 1000 * Microsecond
    Second               = 1000 * Millisecond
    Minute               = 60 * Second
    Hour                 = 60 * Minute
)

函数

  • func Since(t Time) Duration: Since返回从t到现在经过的时间,等价于time.Now().Sub(t)

方法

  • func (d Duration) Hours() float64: 表示为float64类型的小时数
  • func (d Duration) Minutes() float64: 表示为float64类型的分钟数
  • func (d Duration) Seconds() float64: 表示为int64类型的纳秒数,等价于int64(d)

type Timer struct

变量

1
2
3
4
type Timer struct {
    C <-chan Time
    // 内含隐藏或非导出字段
}

函数

  • func NewTimer(d Duration) *Timer: 创建一个倒计时为d的Timer,时间到后像C发送当前时间
  • func AfterFunc(d Duration, f func()) *Timer: 另起一个go程等待时间段d过去,然后调用f,返回Timer对象

方法

  • func (t *Timer) Reset(d Duration) bool: Reset使t重新开始计时,返回真表示调用时t还在倒计时,为假表示t已经停止了
  • func (t *Timer) Stop() bool: Stop停止Timer的执行,返回真表示调用时t还在倒计时,为假表示t已经停止了。Stop不会关闭通道t.C

type Ticker struct

1
2
3
4
type Ticker struct {
    C <-chan Time // 周期性传递时间信息的通道
    // 内含隐藏或非导出字段
}

函数

  • func NewTicker(d Duration) *Ticker: 创建频率为d的Ticker,时间到了会向C发送当前时间

方法

  • func (t *Ticker) Stop(): 关闭一个Ticker,Stop不会关闭通道t.C

常见写法

1
2
3
4
5
t := time.NewTicker(time.Second * 15)
for {
  <-t.C
  ...
}

时区转换需求

如果只是转换显示的结果(不需要修改绝对时间)可以直接修改当前时间对应的location

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
package main

import (
	"fmt"
	"time"
)

func main() {
	a:=time.Now()
	fmt.Println(a)
	l,_:=time.LoadLocation("America/New_York")
	a=a.In(l)
	fmt.Println(a)
}

如果需要按当前时间对应年月日时分秒转换为某一个时区的年月日时分秒(需要修改绝对时间)建议使用Date函数,包括按本地时间Truncate也可以用这个方式,因为Truncate只能按照UTC四舍五入

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
package main

import (
	"fmt"
	"time"
)

func main() {
	loc, _ := time.LoadLocation("America/New_York")
	localtime := time.Now().Truncate(time.Second)
	utctime := localtime.In(time.UTC)
	newyorktime := time.Date(utctime.Year(), utctime.Month(), utctime.Day(), utctime.Hour(), utctime.Minute(), utctime.Second(), 0, loc)
	fmt.Println("localtime\t", localtime)
	fmt.Println("utctime:\t", utctime)
	fmt.Println("newyorktime:\t", newyorktime)
}
 |