简介
时间可分为时间点与时间段,golang 也不例外,提供了以下两种基础类型
- 时间点(Time)
- 时间段(Duration)
常用方法
获取和时间处理方法
// func Now() Time
fmt.Println(time.Now())
// func Parse(layout, value string) (Time, error)
time.Parse("2016-01-02 15:04:05", "2018-04-23 12:24:51")
// func ParseInLocation(layout, value string, loc *Location) (Time, error)
// (layout已带时区时可直接用Parse)
time.ParseInLocation("2006-01-02 15:04:05", "2017-05-11 14:06:06", time.Local)
// func Unix(sec int64, nsec int64) Time
time.Unix(1e9, 0)
// func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time
time.Date(2018, 1, 2, 15, 30, 10, 0, time.Local)
// func (t Time) In(loc *Location) Time 当前时间对应指定时区的时间
loc, _ := time.LoadLocation("America/Los_Angeles")
fmt.Println(time.Now().In(loc))
// func (t Time) Local() Time
获取到时间点之后为了满足业务和设计,需要转换成我们需要的格式,也就是所谓的时间格式化。
格式化
- to string
格式化为字符串我们需要使用 time.Format 方法来转换成我们想要的格式
fmt.Println(time.Now().Format("2006-01-02 15:04:05")) // 2018-04-24 10:11:20
fmt.Println(time.Now().Format(time.UnixDate)) // Tue Apr 24 09:59:02 CST 2018
Format 函数中可以指定你想使用的格式,同时 time 包中也给了一些我们常用的格式
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"
)
注意: galang 中指定的特定时间格式为 “2006-01-02 15:04:05 -0700 MST”, 为了记忆方便,
按照美式时间格式 月日时分秒年 外加时区 排列起来依次是 01/02 03:04:05PM ‘06 -0700。
- to time stamp
func (t Time) Unix() int64
func (t Time) UnixNano() int64
fmt.Println(time.Now().Unix())
// 获取指定日期的时间戳
dt, _ := time.Parse("2016-01-02 15:04:05", "2018-04-23 12:24:51")
fmt.Println(dt.Unix())
fmt.Println(time.Date(2018, 1,2,15,30,10,0, time.Local).Unix())
- 时间段(Duartion)
// func ParseDuration(s string) (Duration, error)
tp, _ := time.ParseDuration("1.5s")
fmt.Println(tp.Truncate(1000), tp.Seconds(), tp.Nanoseconds())
func (d Duration) Hours() float64
func (d Duration) Minutes() float64
func (d Duration) Seconds() float64
func (d Duration) Nanoseconds() int64
func (d Duration) Round(m Duration) Duration // 四舍五入
func (d Duration) Truncate(m Duration) Duration // 向下取整
- 时区(Location)
// 默认UTC
loc, err := time.LoadLocation("")
// 服务器设定的时区,一般为CST
loc, err := time.LoadLocation("Local")
// 美国洛杉矶PDT
loc, err := time.LoadLocation("America/Los_Angeles")
// 获取指定时区的时间点
local, _ := time.LoadLocation("America/Los_Angeles")
fmt.Println(time.Date(2018,1,1,12,0,0,0, local))
- 日期时间计算
dt3 := time.Date(2021, 8, 10, 0, 0, 1, 100, time.Local)
dt4 := time.Date(2021, 8, 11, 23, 59, 22, 100, time.Local)
fmt.Println(dt3.Sub(dt4))
dt := time.Date(2021, 1, 10, 0, 0, 1, 100, time.Local)
fmt.Println(time.Now().After(dt)) // true
fmt.Println(time.Now().Before(dt)) // false
fmt.Println(dt.Equal(time.Now())) // 是否相等
实例 1
package main
import (
"fmt"
"time"
)
func timeTotamp(timetamp int64) {
timeObj := time.Unix(timetamp,0)
year := timeObj.Year()
month := timeObj.Month()
day := timeObj.Day()
hour := timeObj.Hour()
minute := timeObj.Minute()
second := timeObj.Second()
fmt.Printf("%02d-%02d-%02d %02d:%02d:%02d \n",year,month,day,hour,minute,second)
fmt.Printf("%d \n",timetamp)
}
func main() {
now := time.Now()
fmt.Printf("now is %v\n\r",now)
fmt.Printf("format: %02d-%02d-%02d %02d:%02d:%02d \n\r",now.Year(),
now.Month(),now.Day(),now.Hour(),now.Minute(),now.Second())
fmt.Println(now.Format("2006/01/02 15:05:05"))
fmt.Printf("tag1\n\r")
timetamp := time.Now().Unix()
timeTotamp(timetamp)
fmt.Printf("tag2\n\r")
timestr := "2021-08-10"
t1, err := time.Parse("2006-01-02",timestr)
if err != nil {
fmt.Println("timeParse err:",err)
return
}
fmt.Printf("%s\n",t1)
fmt.Printf("%T\n",t1)
fmt.Printf("tag3\n\r")
d1 := time.Now().Add(-24 * time.Hour).Format("2006-01-02 15:04:05")
fmt.Printf("%s\n",d1)
fmt.Printf("tag4\n\r")
tp, _ := time.ParseDuration("5.9s")
fmt.Println(tp.Truncate(1000), tp.Seconds(), tp.Nanoseconds())
fmt.Println(tp.Minutes())
fmt.Printf("tag5\n\r")
loc, err := time.LoadLocation("")
fmt.Println(loc)
loca, err := time.LoadLocation("America/Los_Angeles")
fmt.Println(time.Date(2018,1,1,12,0,0,0,loca))
fmt.Printf("tag6\n\r")
dt3 := time.Date(2021, 8, 10, 0, 0, 1, 100, time.Local)
dt4 := time.Date(2021, 8, 11, 23, 59, 22, 100, time.Local)
fmt.Println(dt3.Sub(dt4))
dt := time.Date(2021, 1, 10, 0, 0, 1, 100, time.Local)
fmt.Println(time.Now().After(dt)) // true
fmt.Println(time.Now().Before(dt)) // false
fmt.Println(dt.Equal(time.Now())) // 是否相等
}
运行结果
robot@ubuntu:~/gomod/src/time$ go run timeFormat.go
now is 2021-08-11 22:00:32.616056587 -0700 PDT m=+0.000062280
format: 2021-08-11 22:00:32
2021/08/11 22:32:32
tag1
2021-08-11 22:00:32
1628744432
tag2
2021-08-10 00:00:00 +0000 UTC
time.Time
tag3
2021-08-10 22:00:32
tag4
5.9s 5.9 5900000000
0.09833333333333333
tag5
UTC
2018-01-01 12:00:00 -0800 PST
tag6
-47h59m21s
true
false
false