简介

编程过程中,一般都会设置到时间的处理。在Go语言中,需要用到time这个包来处理

获取当前时间

默认打印出当前机器上的时间和时区。

package main

import (
	"fmt"
	"time"
)

func main() {
	fmt.Println(time.Now())
}

格式化时间

Go里面时间格式化是要按照的一定的格式来,而且这个格式就是一个日期时间,可以在包里面找到对应的枚举变量

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 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"
)

可以直接使用上面的变量,也可以自己写字符串,但是位置一定要正确,不然格式化出来的时间就是错误的。

fmt.Println(time.Now().Format(time.RFC1123))
fmt.Println(time.Now().Format("2006-01-02 15:04:05"))

可以根据单独的字符串,取出对应的年月日,也可以直接使用提供的函数获取。

fmt.Println(now.Year(), now.Month(), now.Hour(), now.Minute(), now.Second(),now.Weekday())

更多函数

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) Day() int
func (t Time) Hour() int
func (t Time) Minute() int
func (t Time) Second() int
func (t Time) Nanosecond() int
func (t Time) YearDay() int
func (t Time) Weekday() Weekday
func (t Time) ISOWeek() (year, week int)
func (t Time) IsZero() bool
func (t Time) Location() *Location
func (t Time) Zone() (name string, offset int)
func (t Time) Unix() int64

时区

默认是取当前时区的时间,也可以转换成UTC或者其他时区的时间。

loc, _ := time.LoadLocation("America/Los_Angeles")
fmt.Println("America/Los_Angeles time :", now.In(loc))
fmt.Println("UTC time :", now.UTC())

字符串转换成时间格式

默认是可以转换成UTC时间

stringTime, err := time.Parse("2006-01-02 15:04:05", timeString)
if err != nil {
	panic(err)
}
fmt.Println(stringTime)

如果需要转换成指定时区的时间,需要使用ParseInLocation

locStringTime, err := time.ParseInLocation("2006-01-02 15:04:05", timeString, time.Local)
if err != nil {
	panic(err)
}
fmt.Println(locStringTime)

time. Local获取到的是本地的时区。

时间运算

// func Sleep(d Duration)   休眠多少时间,休眠时处于阻塞状态,后续程序无法执行
time.Sleep(time.Duration(10) * time.Second)

// func After(d Duration) <-chan Time  非阻塞,可用于延迟
time.After(time.Duration(10) * time.Second)

// func Since(t Time) Duration 两个时间点的间隔
start := time.Now()
fmt.Println(time.Since(start)) // 等价于 Now().Sub(t), 可用来计算一段业务的消耗时间

//   func Until(t Time) Duration     //  等价于 t.Sub(Now()),t与当前时间的间隔

// func (t Time) Add(d Duration) Time
fmt.Println(now.Add(time.Duration(10) * time.Second)) // 加

//   func (t Time) Sub(u Time) Duration                    // 减

// func (t Time) AddDate(years int, months int, days int) Time
fmt.Println(now.AddDate(1, 1, 1))

// func (t Time) Before(u Time) bool
// func (t Time) After(u Time) bool
// func (t Time) Equal(u Time) bool          比较时间点时尽量使用Equal函数