Goland 時間轉換的那些事

小傅啊發表於2022-03-15

Goland 時間轉換的那些事

在專案的開發過程中遇到的一個很有意思的時間轉換問題

例子

假設有一個需求,是從資料庫獲取到了一個時間,然後需要把時間延後一天,再返回時間戳

得到虛擬碼

t := "2022-03-08 23:59:59"
expireTime, _ := time.Parse("2006-01-02 15:04:05", t)
expireTime = expireTime.Add(time.Hour * 24)
fmt.Println(expireTime.Unix())

//輸出
1646870399

用時間轉換的線上網站對1646870399 進行轉換得到
2022-03-10 07:59:59

這於我們理想中的2022-03-09 23:59:59有很大差距

那麼問題出現在哪裡呢?我們看看time.Parse()這個方法的說明In the absence of a time zone indicator, Parse returns a time in UTC.
就可以知道:在沒有時區指示符的情況下,Parse返回UTC時間。

所以得到的列印結果會與理想中有差距

正確的方法

1. 換成time.ParseInLocation來指定時區

t := "2022-03-08 23:59:59"
expireTime, _ := time.ParseInLocation("2006-01-02 15:04:05", t, time.Local)
expireTime = expireTime.Add(time.Hour * 24)
fmt.Println(expireTime.Unix())

//輸出
1646841599
//轉換後,與理想中的答案一樣
2022-03-09 23:59:59 

2. 在轉換成時間戳的時候指定時區

t := "2022-03-08 23:59:59"
expireTime, _ := time.ParseInLocation("2006-01-02 15:04:05", t, time.Local)
expireTime = expireTime.Add(time.Hour * 24)
fmt.Println(expireTime.Local().Unix())

//輸出
1646841599
//轉換後,與理想中的答案一樣
2022-03-09 23:59:59 

相關文章