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