golang time包做時(shí)間轉(zhuǎn)換操作
Time類(lèi)型
Now方法表示現(xiàn)在時(shí)間。
func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time
返回現(xiàn)在的時(shí)間,
func (t Time) Unix() int64將時(shí)間轉(zhuǎn)換為unix時(shí)間戳,因?yàn)閐uration的限制,所以應(yīng)該只能計(jì)算從1970年開(kāi)始的250年左右
func Unix(sec int64, nsec int64) Time將時(shí)間戳轉(zhuǎn)化為T(mén)ime對(duì)象,看上去相似,只不過(guò)這不是time類(lèi)型的方法
將各種格式的string格式的時(shí)間轉(zhuǎn)換為T(mén)ime對(duì)象用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" )
當(dāng)然也可以自己定義
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這個(gè)時(shí)間,隨意的自己定義會(huì)出現(xiàn)不正確的情況,可以去goplayground上跑一下,比如
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println(time.Now().Format("2004-10-06"))
}
-110-09
另一個(gè)Duration類(lèi)型,表示時(shí)間差,通常用來(lái)執(zhí)行定時(shí)任務(wù)或者計(jì)算到期時(shí)間等
看源代碼,計(jì)數(shù)從ns開(kāi)始所以264/103/103/103/60/60/24/365 大約還剩2^9次方的數(shù)量級(jí),所以前后推250年左右,通常已經(jīng)可以滿足需求
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轉(zhuǎn)為Duration對(duì)象
對(duì)應(yīng)有func (Duration) Hours,func (Duration) Minutes, func (Duration) Seconds, func (Duration) Nanoseconds取小時(shí)數(shù)等
關(guān)于Duration用法的一個(gè)點(diǎn)
如上看到 type Duration int64這一定義
因此我們可以使用常量*time.Second的方式來(lái)定義時(shí)長(zhǎng),比如700*time.Millisecond
但是不能使用變量 a := 700 a*time.Milliscond這種用法,因?yàn)椴煌?lèi)型的不能相乘。建議使用time.Duration(700)*time.Milliscond這種用法
補(bǔ)充:golang 時(shí)區(qū)問(wèn)題以及time包下常用的一寫(xiě)函數(shù)和方法
golang時(shí)區(qū)問(wèn)題
在編寫(xiě)API時(shí)我們可能接收到前端請(qǐng)求的時(shí)間類(lèi)型為字符串,當(dāng)我們將它解析為time類(lèi)型保存到數(shù)據(jù)庫(kù)時(shí),數(shù)據(jù)庫(kù)會(huì)根據(jù)它所在服務(wù)器的時(shí)區(qū)來(lái)給我們的數(shù)據(jù)自動(dòng)設(shè)置時(shí)區(qū),當(dāng)我們從數(shù)據(jù)庫(kù)取出數(shù)據(jù)時(shí),時(shí)區(qū)會(huì)因?yàn)榉?wù)器數(shù)據(jù)庫(kù)的時(shí)區(qū)不同而導(dǎo)致時(shí)區(qū)差的問(wèn)題,進(jìn)而影響我們?cè)诟鶕?jù)時(shí)間做一些判斷時(shí),出現(xiàn)多8時(shí)區(qū)等等問(wèn)題。
所以我們?nèi)〕鰯?shù)據(jù)時(shí)需要做一下時(shí)區(qū)的處理,再進(jìn)行時(shí)間的操作。
用time包的In函數(shù)來(lái)做時(shí)區(qū)轉(zhuǎn)換。
func main(){
//數(shù)據(jù)庫(kù)取出的time類(lèi)型時(shí)間
var testTime time.Time
testTime = time.Now()
fmt.Println(testTime)
//time.Local 獲取的是本地時(shí)區(qū)
t1 := testTime.In(time.Local)
fmt.Println(t1)
//將數(shù)據(jù)庫(kù)時(shí)間轉(zhuǎn)為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
很明顯,“數(shù)據(jù)庫(kù)時(shí)間”.In(time.Local)會(huì)將本地時(shí)區(qū)和服務(wù)器數(shù)據(jù)庫(kù)時(shí)區(qū)進(jìn)行對(duì)比,如果時(shí)區(qū)相同,不做處理,如果時(shí)區(qū)不相同處理為當(dāng)前時(shí)區(qū)
golang標(biāo)準(zhǔn)庫(kù)下time包中常用函數(shù)
Now() Time
獲取當(dāng)前時(shí)間,返回Time類(lèi)型
Unix(sec int64, nsec int64) Time
根據(jù)秒數(shù)和納秒,返回Time類(lèi)型
Date(year int, month Month, day, hour, min, sec, nsec int, loc
*Location) Time
設(shè)置年月日返回,Time類(lèi)型
Since(t Time) Duration
返回與當(dāng)前時(shí)間的時(shí)間差
time常用方法
Date() (year int, month Month, day int)
返回年月日,三個(gè)參數(shù)
Year() int
返回年份
Month() Month
返回月份.是Month類(lèi)型
Day() int
返回多少號(hào)
Weekday() Weekday
返回星期幾,是Weekday類(lèi)型
Clock() (hour, min, sec int)
返回小時(shí),分鐘,秒
Hour() int
返回小時(shí)
Minute() int
返回分鐘
Second() int
返回秒數(shù)
Nanosecond() int
返回納秒
Add(d Duration) Time
為一個(gè)時(shí)間,添加的時(shí)間類(lèi)型為Duration.更精確到納秒.比起AddDate
Sub(u Time) Duration
計(jì)算兩個(gè)時(shí)間的差.返回類(lèi)型Duration
AddDate(years int, months int, days int) Time
添加時(shí)間.以年月日為參數(shù)
Local() Time
設(shè)置location為本地時(shí)間.就是電腦時(shí)間.
Unix() int64
返回時(shí)間戳,自從1970年1月1號(hào)到現(xiàn)在
UnixNano() int64
返回時(shí)間戳.包含納秒
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
- Go語(yǔ)言中時(shí)間time相關(guān)處理方法詳解
- Go Time庫(kù)中時(shí)間和日期相關(guān)的操作方法整理
- go?time.Sleep睡眠指定時(shí)間實(shí)例詳解(小時(shí)級(jí)到納秒級(jí))
- golang中time包之時(shí)間間隔格式化和秒、毫秒、納秒等時(shí)間戳格式輸出的方法實(shí)例
- 解決golang時(shí)間字符串轉(zhuǎn)time.Time的坑
- golang的time包:秒、毫秒、納秒時(shí)間戳輸出方式
- golang 使用time包獲取時(shí)間戳與日期格式化操作
- django 中使用DateTime常用的時(shí)間查詢方式
- Go語(yǔ)言時(shí)間管理利器之深入解析time模塊的實(shí)戰(zhàn)技巧
相關(guān)文章
Golang 獲取文件md5校驗(yàn)的方法以及效率對(duì)比
這篇文章主要介紹了Golang 獲取文件md5校驗(yàn)的方法以及效率對(duì)比,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05
淺析Golang中如何實(shí)現(xiàn)一個(gè)強(qiáng)大的重試機(jī)制
在 Go 語(yǔ)言中,實(shí)現(xiàn)一個(gè)強(qiáng)大的重試機(jī)制可以通過(guò)多種方式來(lái)完成,這篇文章為大家介紹了一個(gè)常見(jiàn)的實(shí)現(xiàn)方法,需要的小伙伴可以參考一下2025-03-03
Golang 利用反射對(duì)結(jié)構(gòu)體優(yōu)雅排序的操作方法
這篇文章主要介紹了Golang 利用反射對(duì)結(jié)構(gòu)體優(yōu)雅排序的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10
Golang實(shí)現(xiàn)Redis網(wǎng)絡(luò)協(xié)議實(shí)例探究
這篇文章主要為大家介紹了Golang實(shí)現(xiàn)Redis網(wǎng)絡(luò)協(xié)議實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01

