GO中的時(shí)間操作總結(jié)(time&dateparse)
〇、前言
日常開(kāi)發(fā)過(guò)程中,對(duì)于時(shí)間的操作可謂是無(wú)處不在,但是想實(shí)現(xiàn)時(shí)間自由還是不簡(jiǎn)單的,多種時(shí)間格式容易混淆,那么本文將進(jìn)行梳理,一起學(xué)習(xí)下。
官方提供的庫(kù)是 time,功能很全面,本文也會(huì)詳細(xì)介紹。
還有另外一個(gè)開(kāi)源庫(kù) dateparse,使用起來(lái)比較方便,本文也會(huì)將加入示例測(cè)試出結(jié)果,以展示其優(yōu)點(diǎn)。
一、time 庫(kù)
1.1 Time 類(lèi)型的結(jié)構(gòu)
go 通過(guò)time.Now()
來(lái)取當(dāng)前時(shí)間,打印出來(lái)如下:
2023-09-15 17:59:14.2642387 +0800 CST m=+0.010202701
這里存在兩個(gè)疑點(diǎn):1)表示秒級(jí)的數(shù)值為什么默認(rèn)為 7 位? 2)最后邊的 m=... 代表什么?
1)對(duì)于時(shí)間戳來(lái)說(shuō),一般采用秒級(jí)或毫秒級(jí)。采用浮點(diǎn)數(shù)或定點(diǎn)數(shù)來(lái)表示小數(shù)部分,需要一定的字節(jié)數(shù)來(lái)存儲(chǔ),而為了在大多數(shù)應(yīng)用場(chǎng)景下滿足足夠的精度,一般會(huì)選擇使用7位數(shù)字來(lái)表示毫秒級(jí)的小數(shù)部分,從而達(dá)到既滿足絕大多數(shù)需求又占用盡量上的存儲(chǔ)。
2)m 就是 Monotonic Clocks,意思是單調(diào)時(shí)間的,所謂單調(diào),就是只會(huì)不停的往前增長(zhǎng),不受校時(shí)操作的影響,這個(gè)時(shí)間是自進(jìn)程啟動(dòng)以來(lái)的秒數(shù)。
在 go1.9 之后,結(jié)構(gòu)更新為:
type Time struct { wall uint64 ext int64 loc *Location }
Time 結(jié)構(gòu)體中由三部分組成,loc 比較明了,表示時(shí)區(qū),wall 和 ext 所存儲(chǔ)的信息規(guī)則相對(duì)復(fù)雜,根據(jù)文檔的介紹總結(jié)成了下圖:
golang 中的 Time 結(jié)構(gòu),不像很多語(yǔ)言保存 Unix 時(shí)間戳(也就是最早只能表示到 1970 年 1 月 1 日),而是至少可以安全的表示 1885 年以來(lái)的時(shí)間。
下面來(lái)取當(dāng)前時(shí)間測(cè)試下:
package main import ( "encoding/json" "fmt" "time" ) func main() { now := time.Now() // 取當(dāng)前時(shí)間 time_now := now fmt.Println(time_now) for i := 0; i < 5; i++ { // 循環(huán) 0~4 共 5 此 time_now = time_now.Add(1 * time.Second) // 每次加 1 秒 fmt.Println(time_now) } encodeNow, _ := json.Marshal(now) // 轉(zhuǎn) json 編碼 decodeNow := time.Time{} json.Unmarshal(encodeNow, &decodeNow) // 將 json 編碼轉(zhuǎn)回 Time fmt.Println(decodeNow) equal_r := now.Equal(decodeNow) fmt.Println(equal_r) }
結(jié)果如下,可見(jiàn)循環(huán)了五次,每次 m 的值都加 1,json 編碼轉(zhuǎn)換后的時(shí)間中 m 參數(shù)消失:
1.2 獲取當(dāng)前時(shí)間與格式化
1.2.1 取當(dāng)前時(shí)間
回去當(dāng)前時(shí)間的方法很簡(jiǎn)單:
now := time.Now() fmt.Println(now) // 2023-09-18 13:51:40.8480546 +0800 CST m=+0.008992401 fmt.Println(now.String()) // 2023-09-18 13:51:40.8480546 +0800 CST m=+0.008992401
1.2.2 時(shí)間格式化
Go 語(yǔ)言提供了時(shí)間類(lèi)型格式化函數(shù) Format(),需要注意的是 Go 語(yǔ)言格式化時(shí)間模板不是常見(jiàn)的 Y-m-d H:i:s,而是 2006-01-02 15:04:05,也很好記憶(2006 1 2 3 4 5)。
func (t Time) Format(layout string) string { }
time 庫(kù)中,定義了年、月、日、時(shí)、分、秒、周、時(shí)區(qū)的多種表現(xiàn)形式,如下:
- 年: 06/2006
- 月: 1/01/Jan/January
- 日: 2/02/_2
- 時(shí): 3/03/15/PM/pm/AM/am
- 分: 4/04
- 秒: 5/05
- 周: Mon/Monday
- 時(shí)區(qū):-07/-0700/Z0700/Z07:00/-07:00/MST
這些格式的形式配置,可以根據(jù)自己的需求自由組合,一下是部分組合的測(cè)試:
package main import ( "fmt" "time" ) func main() { now := time.Now() fmt.Println(now) fmt.Println("2006-01-02 15:04:05 output:", now.Format("2006-01-02 15:04:05")) fmt.Println("2006-01-02 output:", now.Format("2006-01-02")) fmt.Println("01-02-2006 output:", now.Format("01-02-2006")) fmt.Println("15:03:04 output:", now.Format("15:03:04")) fmt.Println("2006/01/02 15:04 output:", now.Format("2006/01/02 15:04")) fmt.Println("15:04 2006/01/02 output:", now.Format("15:04 2006/01/02")) fmt.Println("2006#01#02 output:", now.Format("2006#01#02")) fmt.Println("2006$01$02 output:", now.Format("2006$01$02")) fmt.Println("2006-01-02 15:04:05.000 output:", now.Format("2006-01-02 15:04:05.000")) fmt.Println("2006-01-02 15:04:05.000000000 output:", now.Format("2006-01-02 15:04:05.000000000")) fmt.Println("2006-January-02 15:04:05 Monday output:", now.Format("2006-January-02 15:04:05 Monday")) fmt.Println("2006-Jan-02 15:04:05 Mon output:", now.Format("2006-Jan-02 15:04:05 Mon")) fmt.Println("2006-1-2 3:4:5 PM output:", now.Format("2006-1-2 3:4:5 PM")) }
字符串類(lèi)型的日期轉(zhuǎn) Time:
package main import ( "fmt" "time" ) func main() { t, _ := time.ParseInLocation("2006-01-02", "2023-09-18", time.Local) // time.Local 指定本地時(shí)間 fmt.Println(t) t, _ = time.ParseInLocation("2006-01-02 15:04:05", "2023-09-18 17:46:13", time.Local) fmt.Println(t) t, _ = time.ParseInLocation("2006-01-02 15:04:05", "2023-09-18", time.Local) fmt.Println(t) // 當(dāng)時(shí)間字符串和標(biāo)準(zhǔn)字符串不統(tǒng)一時(shí),轉(zhuǎn)化失敗 }
1.2.3 取日期的單個(gè)值
日期的組成部分比較多,下面來(lái)嘗試取出各個(gè)部分的值:
package main import ( "fmt" "time" ) func main() { now := time.Now() // 返回日期 year, month, day := now.Date() fmt.Printf("日期:%d年%d月%d日\(chéng)n", year, month, day) fmt.Println("年:", now.Year()) // int fmt.Println("月:", now.Month()) // time.Month fmt.Println("月:", now.Month().String()) fmt.Println("月:", int(now.Month())) fmt.Println("日:", now.Day()) // int // 時(shí)分秒 hour, minute, second := now.Clock() fmt.Printf("時(shí)間:%d:%d:%d\n", hour, minute, second) fmt.Println("時(shí):", now.Hour()) // int fmt.Println("分:", now.Minute()) // int fmt.Println("秒:", now.Second()) // int fmt.Println("星期:", now.Weekday()) // time.Weekday fmt.Println("星期:", now.Weekday().String()) // 不能得到 一、二。。。 fmt.Println("星期:", int(now.Weekday())) // 可以通過(guò)取得的 1、2。。。來(lái)計(jì)算是周幾 fmt.Println("天數(shù):", now.YearDay()) // int fmt.Println("時(shí)區(qū):", now.Location()) }
1.3 日期的計(jì)算
計(jì)算之前或之后一段時(shí)間:
package main import ( "fmt" "time" ) func main() { now := time.Now() fmt.Println(now, "(當(dāng)前時(shí)間)") // func (t Time) AddDate(years int, months int, days int) Time m0 := now.AddDate(1, 1, 1) fmt.Println(m0, "(now.AddDate(1,1,1))") m00 := now.AddDate(0, 1, 1) fmt.Println(m00, "(now.AddDate(0,1,1))") // func ParseDuration(s string) (Duration, error) // s string:"ns", "us" (or "μs"), "ms", "s", "m", "h" t1, _ := time.ParseDuration("1h1m1s") // 亦可:48h1m1s m1 := now.Add(t1) fmt.Println(m1, "(1小時(shí)1分1s之后)") t2, _ := time.ParseDuration("-1h1m1s") m2 := now.Add(t2) fmt.Println(m2, "(1小時(shí)1分1s之前)") t3, _ := time.ParseDuration("-1h") m3 := now.Add(t3 * 3) fmt.Println(m3, "(3小時(shí)之前)") }
時(shí)間差和比較時(shí)間大?。?/strong>
package main import ( "fmt" "time" ) func main() { now := time.Now() fmt.Println(now, "(當(dāng)前時(shí)間)") // func (t Time) Sub(u Time) Duration // 取時(shí)間差對(duì)象 sub1 := now.Sub(m1) fmt.Println(sub1.Hours(), "(相差小時(shí)數(shù))") fmt.Println(sub1.Minutes(), "(相差分鐘數(shù))") // time.Since(t Time) Duration // 返回當(dāng)前時(shí)間與 t 的時(shí)間差,返回值是 Duration // time.Until(t Time) Duration // 返回 t 與當(dāng)前時(shí)間的時(shí)間差,返回值是 Duration t1s, _ := time.ParseDuration("-1h") m1s := now.Add(t1s) fmt.Println(time.Since(m1s), "(Since)") fmt.Println(time.Until(m1s), "(Until)") // func (t Time) Before(u Time) bool // 如果 t 代表的時(shí)間點(diǎn)在 u 之前,返回真;否則返回假 // func (t Time) After(u Time) bool // 如果 t 代表的時(shí)間點(diǎn)在 u 之后,返回真;否則返回假 // func (t Time) Equal(u Time) bool // 比較時(shí)間是否相等,相等返回真;否則返回假 t1m, _ := time.ParseDuration("1h") m1m := now.Add(t1m) fmt.Println(m1m) fmt.Println(m1m.After(now), "(After(now))") fmt.Println(m1m.Before(now), "(Before(now))") fmt.Println(now.Equal(m1m), "(Equal(m1m))") }
1.4 時(shí)間戳
如何取時(shí)間戳:
package main import ( "fmt" "time" ) func main() { now := time.Now() fmt.Println(now, "(當(dāng)前時(shí)間)") // 取時(shí)間戳 fmt.Println(now.Unix()) // 當(dāng)前時(shí)間戳 fmt.Println(now.UnixMilli()) // 毫秒級(jí)時(shí)間戳 fmt.Println(now.UnixMicro()) // 微秒級(jí)時(shí)間戳 fmt.Println(now.UnixNano()) // 納秒級(jí)時(shí)間戳 fmt.Println(now.Nanosecond()) // 時(shí)間戳小數(shù)部分 單位:納秒 }
時(shí)間戳與時(shí)間的簡(jiǎn)單轉(zhuǎn)換:
package main import ( "fmt" "time" ) func main() { now := time.Now() fmt.Println(now, "(當(dāng)前時(shí)間)") unix := now.Unix() fmt.Println(unix, "(秒級(jí)時(shí)間戳)") t := time.Unix(unix, 0) fmt.Println(t, "(原時(shí)間)") t = time.Unix(unix, 1) // 在時(shí)間戳的基礎(chǔ)上,加 1 納秒 fmt.Println(t, "(加 1 納秒)") micro_unix := now.UnixMicro() fmt.Println(micro_unix, "(微秒級(jí)時(shí)間戳)") t1 := time.UnixMicro(micro_unix) fmt.Println(t1) }
參考:
Golang中時(shí)間格式化的實(shí)現(xiàn)詳解
一文帶你理解Golang中的Time結(jié)構(gòu)
二、dateparse 庫(kù)
dateparse 庫(kù)的作用主要就是將不同格式的字符串類(lèi)型的時(shí)間,轉(zhuǎn)為 Time 時(shí)間類(lèi)型。源碼地址:https://github.com/araddon/dateparse
根據(jù)本文 1.2.2 章節(jié)中第二部分 的轉(zhuǎn)換方法,并不能用于全部字符串日期的轉(zhuǎn)換,容易出現(xiàn)轉(zhuǎn)換失敗的情況。另外需要根據(jù)源日期的格式組織標(biāo)準(zhǔn)日期的格式,也會(huì)增加工作量。但是,當(dāng)用上 dateparse 庫(kù)后,這一切將變的非常簡(jiǎn)單。
dateparse 庫(kù),就是將各種類(lèi)型的日期格式字符串,轉(zhuǎn)換成同樣的格式,參考:2006-01-02 15:04:05 +0000 UTC。
具體引用的方法是func ParseLocal(datestr string, opts ...ParserOption) (time.Time, error){ }
,調(diào)用示例為Time_date_output := dateparse.ParseLocal(str_date_input)
。
以下代碼是 github 上源碼中的示例,供參考:
package main import ( "flag" "fmt" "time" "github.com/scylladb/termtables" "github.com/araddon/dateparse" ) var examples = []string{ "May 8, 2009 5:57:51 PM", "oct 7, 1970", "oct 7, '70", ... } var ( timezone = "" ) func main() { flag.StringVar(&timezone, "timezone", "UTC", "Timezone aka `America/Los_Angeles` formatted time-zone") flag.Parse() // 取命令行參數(shù) timezone if timezone != "" { loc, err := time.LoadLocation(timezone) if err != nil { panic(err.Error()) } time.Local = loc // 將默認(rèn)的本地值修改為輸入的本地參數(shù) } table := termtables.CreateTable() table.AddHeaders("Input", "Parsed, and Output as %v") for _, dateExample := range examples { // 循環(huán)全部日期格式字符串,并輸出轉(zhuǎn)換后的格式 t, err := dateparse.ParseLocal(dateExample) if err != nil { panic(err.Error()) } table.AddRow(dateExample, fmt.Sprintf("%v", t)) } fmt.Println(table.Render()) } /* +-------------------------------------------------------+-----------------------------------------+ | Input | Parsed, and Output as %v | +-------------------------------------------------------+-----------------------------------------+ | May 8, 2009 5:57:51 PM | 2009-05-08 17:57:51 +0000 UTC | | oct 7, 1970 | 1970-10-07 00:00:00 +0000 UTC | | oct 7, '70 | 1970-10-07 00:00:00 +0000 UTC | | oct. 7, 1970 | 1970-10-07 00:00:00 +0000 UTC | | oct. 7, 70 | 1970-10-07 00:00:00 +0000 UTC | | Mon Jan 2 15:04:05 2006 | 2006-01-02 15:04:05 +0000 UTC | | Mon Jan 2 15:04:05 MST 2006 | 2006-01-02 15:04:05 +0000 MST | | Mon Jan 02 15:04:05 -0700 2006 | 2006-01-02 15:04:05 -0700 -0700 | | Monday, 02-Jan-06 15:04:05 MST | 2006-01-02 15:04:05 +0000 MST | | Mon, 02 Jan 2006 15:04:05 MST | 2006-01-02 15:04:05 +0000 MST | | Tue, 11 Jul 2017 16:28:13 +0200 (CEST) | 2017-07-11 16:28:13 +0200 +0200 | | Mon, 02 Jan 2006 15:04:05 -0700 | 2006-01-02 15:04:05 -0700 -0700 | | Mon 30 Sep 2018 09:09:09 PM UTC | 2018-09-30 21:09:09 +0000 UTC | | Mon Aug 10 15:44:11 UTC+0100 2015 | 2015-08-10 15:44:11 +0000 UTC | | Thu, 4 Jan 2018 17:53:36 +0000 | 2018-01-04 17:53:36 +0000 UTC | | Fri Jul 03 2015 18:04:07 GMT+0100 (GMT Daylight Time) | 2015-07-03 18:04:07 +0100 GMT | | Sun, 3 Jan 2021 00:12:23 +0800 (GMT+08:00) | 2021-01-03 00:12:23 +0800 +0800 | | September 17, 2012 10:09am | 2012-09-17 10:09:00 +0000 UTC | | September 17, 2012 at 10:09am PST-08 | 2012-09-17 10:09:00 -0800 PST | | September 17, 2012, 10:10:09 | 2012-09-17 10:10:09 +0000 UTC | | October 7, 1970 | 1970-10-07 00:00:00 +0000 UTC | | October 7th, 1970 | 1970-10-07 00:00:00 +0000 UTC | | 12 Feb 2006, 19:17 | 2006-02-12 19:17:00 +0000 UTC | | 12 Feb 2006 19:17 | 2006-02-12 19:17:00 +0000 UTC | | 14 May 2019 19:11:40.164 | 2019-05-14 19:11:40.164 +0000 UTC | | 7 oct 70 | 1970-10-07 00:00:00 +0000 UTC | | 7 oct 1970 | 1970-10-07 00:00:00 +0000 UTC | | 03 February 2013 | 2013-02-03 00:00:00 +0000 UTC | | 1 July 2013 | 2013-07-01 00:00:00 +0000 UTC | | 2013-Feb-03 | 2013-02-03 00:00:00 +0000 UTC | | 06/Jan/2008:15:04:05 -0700 | 2008-01-06 15:04:05 -0700 -0700 | | 06/Jan/2008 15:04:05 -0700 | 2008-01-06 15:04:05 -0700 -0700 | | 3/31/2014 | 2014-03-31 00:00:00 +0000 UTC | | 03/31/2014 | 2014-03-31 00:00:00 +0000 UTC | | 08/21/71 | 1971-08-21 00:00:00 +0000 UTC | | 8/1/71 | 1971-08-01 00:00:00 +0000 UTC | | 4/8/2014 22:05 | 2014-04-08 22:05:00 +0000 UTC | | 04/08/2014 22:05 | 2014-04-08 22:05:00 +0000 UTC | | 4/8/14 22:05 | 2014-04-08 22:05:00 +0000 UTC | | 04/2/2014 03:00:51 | 2014-04-02 03:00:51 +0000 UTC | | 8/8/1965 12:00:00 AM | 1965-08-08 00:00:00 +0000 UTC | | 8/8/1965 01:00:01 PM | 1965-08-08 13:00:01 +0000 UTC | | 8/8/1965 01:00 PM | 1965-08-08 13:00:00 +0000 UTC | | 8/8/1965 1:00 PM | 1965-08-08 13:00:00 +0000 UTC | | 8/8/1965 12:00 AM | 1965-08-08 00:00:00 +0000 UTC | | 4/02/2014 03:00:51 | 2014-04-02 03:00:51 +0000 UTC | | 03/19/2012 10:11:59 | 2012-03-19 10:11:59 +0000 UTC | | 03/19/2012 10:11:59.3186369 | 2012-03-19 10:11:59.3186369 +0000 UTC | | 2014/3/31 | 2014-03-31 00:00:00 +0000 UTC | | 2014/03/31 | 2014-03-31 00:00:00 +0000 UTC | | 2014/4/8 22:05 | 2014-04-08 22:05:00 +0000 UTC | | 2014/04/08 22:05 | 2014-04-08 22:05:00 +0000 UTC | | 2014/04/2 03:00:51 | 2014-04-02 03:00:51 +0000 UTC | | 2014/4/02 03:00:51 | 2014-04-02 03:00:51 +0000 UTC | | 2012/03/19 10:11:59 | 2012-03-19 10:11:59 +0000 UTC | | 2012/03/19 10:11:59.3186369 | 2012-03-19 10:11:59.3186369 +0000 UTC | | 2014:3:31 | 2014-03-31 00:00:00 +0000 UTC | | 2014:03:31 | 2014-03-31 00:00:00 +0000 UTC | | 2014:4:8 22:05 | 2014-04-08 22:05:00 +0000 UTC | | 2014:04:08 22:05 | 2014-04-08 22:05:00 +0000 UTC | | 2014:04:2 03:00:51 | 2014-04-02 03:00:51 +0000 UTC | | 2014:4:02 03:00:51 | 2014-04-02 03:00:51 +0000 UTC | | 2012:03:19 10:11:59 | 2012-03-19 10:11:59 +0000 UTC | | 2012:03:19 10:11:59.3186369 | 2012-03-19 10:11:59.3186369 +0000 UTC | | 2014年04月08日 | 2014-04-08 00:00:00 +0000 UTC | | 2006-01-02T15:04:05+0000 | 2006-01-02 15:04:05 +0000 UTC | | 2009-08-12T22:15:09-07:00 | 2009-08-12 22:15:09 -0700 -0700 | | 2009-08-12T22:15:09 | 2009-08-12 22:15:09 +0000 UTC | | 2009-08-12T22:15:09.988 | 2009-08-12 22:15:09.988 +0000 UTC | | 2009-08-12T22:15:09Z | 2009-08-12 22:15:09 +0000 UTC | | 2017-07-19T03:21:51:897+0100 | 2017-07-19 03:21:51.897 +0100 +0100 | | 2019-05-29T08:41-04 | 2019-05-29 08:41:00 -0400 -0400 | | 2014-04-26 17:24:37.3186369 | 2014-04-26 17:24:37.3186369 +0000 UTC | | 2012-08-03 18:31:59.257000000 | 2012-08-03 18:31:59.257 +0000 UTC | | 2014-04-26 17:24:37.123 | 2014-04-26 17:24:37.123 +0000 UTC | | 2013-04-01 22:43 | 2013-04-01 22:43:00 +0000 UTC | | 2013-04-01 22:43:22 | 2013-04-01 22:43:22 +0000 UTC | | 2014-12-16 06:20:00 UTC | 2014-12-16 06:20:00 +0000 UTC | | 2014-12-16 06:20:00 GMT | 2014-12-16 06:20:00 +0000 UTC | | 2014-04-26 05:24:37 PM | 2014-04-26 17:24:37 +0000 UTC | | 2014-04-26 13:13:43 +0800 | 2014-04-26 13:13:43 +0800 +0800 | | 2014-04-26 13:13:43 +0800 +08 | 2014-04-26 13:13:43 +0800 +0800 | | 2014-04-26 13:13:44 +09:00 | 2014-04-26 13:13:44 +0900 +0900 | | 2012-08-03 18:31:59.257000000 +0000 UTC | 2012-08-03 18:31:59.257 +0000 UTC | | 2015-09-30 18:48:56.35272715 +0000 UTC | 2015-09-30 18:48:56.35272715 +0000 UTC | | 2015-02-18 00:12:00 +0000 GMT | 2015-02-18 00:12:00 +0000 UTC | | 2015-02-18 00:12:00 +0000 UTC | 2015-02-18 00:12:00 +0000 UTC | | 2015-02-08 03:02:00 +0300 MSK m=+0.000000001 | 2015-02-08 03:02:00 +0300 +0300 | | 2015-02-08 03:02:00.001 +0300 MSK m=+0.000000001 | 2015-02-08 03:02:00.001 +0300 +0300 | | 2017-07-19 03:21:51+00:00 | 2017-07-19 03:21:51 +0000 UTC | | 2014-04-26 | 2014-04-26 00:00:00 +0000 UTC | | 2014-04 | 2014-04-01 00:00:00 +0000 UTC | | 2014 | 2014-01-01 00:00:00 +0000 UTC | | 2014-05-11 08:20:13,787 | 2014-05-11 08:20:13.787 +0000 UTC | | 2020-07-20+08:00 | 2020-07-20 00:00:00 +0800 +0800 | | 3.31.2014 | 2014-03-31 00:00:00 +0000 UTC | | 03.31.2014 | 2014-03-31 00:00:00 +0000 UTC | | 08.21.71 | 1971-08-21 00:00:00 +0000 UTC | | 2014.03 | 2014-03-01 00:00:00 +0000 UTC | | 2014.03.30 | 2014-03-30 00:00:00 +0000 UTC | | 20140601 | 2014-06-01 00:00:00 +0000 UTC | | 20140722105203 | 2014-07-22 10:52:03 +0000 UTC | | 171113 14:14:20 | 2017-11-13 14:14:20 +0000 UTC | | 1332151919 | 2012-03-19 10:11:59 +0000 UTC | | 1384216367189 | 2013-11-12 00:32:47.189 +0000 UTC | | 1384216367111222 | 2013-11-12 00:32:47.111222 +0000 UTC | | 1384216367111222333 | 2013-11-12 00:32:47.111222333 +0000 UTC | +-------------------------------------------------------+-----------------------------------------+ */
以上就是GO中的時(shí)間操作總結(jié)(time&dateparse)的詳細(xì)內(nèi)容,更多關(guān)于GO時(shí)間操作的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
go語(yǔ)言區(qū)塊鏈實(shí)戰(zhàn)實(shí)現(xiàn)簡(jiǎn)單的區(qū)塊與區(qū)塊鏈
這篇文章主要為大家介紹了go語(yǔ)言區(qū)塊鏈的實(shí)戰(zhàn)學(xué)習(xí),來(lái)實(shí)現(xiàn)簡(jiǎn)單的區(qū)塊與區(qū)塊鏈?zhǔn)纠^(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10Go語(yǔ)言使用Swiss Table實(shí)現(xiàn)更快的map
wiss Table 是一種高效的哈希表實(shí)現(xiàn),最初由 Google 在 C++ 中引入,后來(lái)也被其他語(yǔ)言(如 Rust)采用,下面我們看看如何使用 Swiss Table 的思想來(lái)實(shí)現(xiàn)一個(gè)更快的 Go map2025-03-03Go語(yǔ)言中的Slice學(xué)習(xí)總結(jié)
這篇文章主要介紹了Go語(yǔ)言中的Slice學(xué)習(xí)總結(jié),本文講解了Slice的定義、Slice的長(zhǎng)度和容量、Slice是引用類(lèi)型、Slice引用傳遞發(fā)生“意外”等內(nèi)容,需要的朋友可以參考下2014-11-11golang使用map支持高并發(fā)的方法(1000萬(wàn)次操作14ms)
這篇文章主要介紹了golang使用map支持高并發(fā)的方法(1000萬(wàn)次操作14ms),本文給大家詳細(xì)講解,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-11-11go語(yǔ)言中字符串嵌套的幾種實(shí)現(xiàn)方式
在Go語(yǔ)言中,字符串嵌套可以通過(guò)多種方式實(shí)現(xiàn),包括使用雙引號(hào)和轉(zhuǎn)義字符、反引號(hào)、字符串拼接和格式化字符串,下面就來(lái)介紹一下,感興趣的可以了解一下2025-03-03Go通過(guò)goroutine實(shí)現(xiàn)多協(xié)程文件上傳的基本流程
多協(xié)程文件上傳是指利用多線程或多協(xié)程技術(shù),同時(shí)上傳一個(gè)或多個(gè)文件,以提高上傳效率和速度,本文給大家介紹了Go通過(guò)goroutine實(shí)現(xiàn)多協(xié)程文件上傳的基本流程,需要的朋友可以參考下2024-05-05Golang設(shè)計(jì)模式之原型模式詳細(xì)講解
如果一個(gè)類(lèi)的有非常多的屬性,層級(jí)還很深。每次構(gòu)造起來(lái),不管是直接構(gòu)造還是用建造者模式,都要對(duì)太多屬性進(jìn)行復(fù)制,那么有沒(méi)有一種好的方式讓我們創(chuàng)建太的時(shí)候使用體驗(yàn)更好一點(diǎn)呢? 今天的文章里就給大家介紹一種設(shè)計(jì)模式,來(lái)解決這個(gè)問(wèn)題2023-01-01Go語(yǔ)言使用goroutine及通道實(shí)現(xiàn)并發(fā)詳解
這篇文章主要為大家介紹了Go語(yǔ)言使用goroutine及通道實(shí)現(xiàn)并發(fā)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08go語(yǔ)言題解LeetCode453最小操作次數(shù)使數(shù)組元素相等
這篇文章主要為大家介紹了go語(yǔ)言題解LeetCode453最小操作次數(shù)使數(shù)組元素相等示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12