1. 程式人生 > 程式設計 >golang time包做時間轉換操作

golang time包做時間轉換操作

Time型別

Now方法表示現在時間。

func Date(year int,month Month,day,hour,min,sec,nsec int,loc *Location) Time

返回現在的時間,

func (t Time) Unix() int64將時間轉換為unix時間戳,因為duration的限制,所以應該只能計算從1970年開始的250年左右

func Unix(sec int64,nsec int64) Time將時間戳轉化為Time物件,看上去相似,只不過這不是time型別的方法

將各種格式的string格式的時間轉換為Time物件用Parse方法

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

當然也可以自己定義

const longForm = "Jan 2,2006 at 3:04pm (MST)"

t,_ := time.Parse(longForm,"Feb 3,2013 at 7:54pm (PST)")

time.format用的就是2016-01-02 15:04:05這個時間,隨意的自己定義會出現不正確的情況,可以去goplayground上跑一下,比如

package main

import (
 "fmt"
 "time"
)

func main() {
 fmt.Println(time.Now().Format("2004-10-06"))
}

-110-09

另一個Duration型別,表示時間差,通常用來執行定時任務或者計算到期時間等

看原始碼,計數從ns開始所以264/103/103/103/60/60/24/365 大約還剩2^9次方的數量級,所以前後推250年左右,通常已經可以滿足需求

type Duration int64

const (
 minDuration Duration = -1 << 63
 maxDuration Duration = 1<<63 - 1
)
const (
 Nanosecond Duration = 1
 Microsecond     = 1000 * Nanosecond
 Millisecond     = 1000 * Microsecond
 Second        = 1000 * Millisecond
 Minute        = 60 * Second
 Hour         = 60 * Minute
)

ParseDuration(s string) (Duration,error) 把Duration String轉為Duration物件

對應有func (Duration) Hours,func (Duration) Minutes,func (Duration) Seconds,func (Duration) Nanoseconds取小時數等

關於Duration用法的一個點

如上看到 type Duration int64這一定義

因此我們可以使用常量*time.Second的方式來定義時長,比如700*time.Millisecond

但是不能使用變數 a := 700 a*time.Milliscond這種用法,因為不同型別的不能相乘。建議使用time.Duration(700)*time.Milliscond這種用法

補充:golang 時區問題以及time包下常用的一寫函式和方法

golang時區問題

在編寫API時我們可能接收到前端請求的時間型別為字串,當我們將它解析為time型別儲存到資料庫時,資料庫會根據它所在伺服器的時區來給我們的資料自動設定時區,當我們從資料庫取出資料時,時區會因為伺服器資料庫的時區不同而導致時區差的問題,進而影響我們在根據時間做一些判斷時,出現多8時區等等問題。

所以我們取出資料時需要做一下時區的處理,再進行時間的操作。

用time包的In函式來做時區轉換。

func main(){
 //資料庫取出的time型別時間
 var testTime time.Time
 testTime = time.Now()
 fmt.Println(testTime)

 //time.Local 獲取的是本地時區
 t1 := testTime.In(time.Local)
 fmt.Println(t1)

 //將資料庫時間轉為UTC
 t2 := testTime.UTC()
 fmt.Println(t2)

 t3 := t2.In(time.Local)
 fmt.Println(t3)
}

輸出:

2019-03-22 10:05:12.6073357 +0800 CST m=+0.003014901
2019-03-22 10:05:12.6073357 +0800 CST
2019-03-22 02:05:12.6073357 +0000 UTC
2019-03-22 10:05:12.6073357 +0800 CST

很明顯,“資料庫時間”.In(time.Local)會將本地時區和伺服器資料庫時區進行對比,如果時區相同,不做處理,如果時區不相同處理為當前時區

golang標準庫下time包中常用函式

Now() Time

獲取當前時間,返回Time型別

Unix(sec int64,nsec int64) Time

根據秒數和納秒,返回Time型別

Date(year int,loc

*Location) Time

設定年月日返回,Time型別

Since(t Time) Duration

返回與當前時間的時間差

time常用方法

Date() (year int,day int)

返回年月日,三個引數

Year() int

返回年份

Month() Month

返回月份.是Month型別

Day() int

返回多少號

Weekday() Weekday

返回星期幾,是Weekday型別

Clock() (hour,sec int)

返回小時,分鐘,秒

Hour() int

返回小時

Minute() int

返回分鐘

Second() int

返回秒數

Nanosecond() int

返回納秒

Add(d Duration) Time

為一個時間,新增的時間型別為Duration.更精確到納秒.比起AddDate

Sub(u Time) Duration

計算兩個時間的差.返回型別Duration

AddDate(years int,months int,days int) Time

新增時間.以年月日為引數

Local() Time

設定location為本地時間.就是電腦時間.

Unix() int64

返回時間戳,自從1970年1月1號到現在

UnixNano() int64

返回時間戳.包含納秒

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。如有錯誤或未考慮完全的地方,望不吝賜教。