【Golang】time的時(shí)區(qū)問(wèn)題

先上代碼

package main

import (
    "fmt"
    "time"
)

var (
    layout    string = "2006-01-02 15:04:05"
    startTime string = "2020-03-25 17:00:00"
    endTime   string = "2020-03-25 19:00:00"
)

func main() {
    start, _ := time.Parse(layout, startTime)
    fmt.Printf("initTime is %v\n", start)
    //initTime is 2020-03-25 17:00:00 +0000 UTC

    end, _ := time.Parse(layout, endTime)
    fmt.Printf("end is %v\n", end)
    //end is 2020-03-25 19:00:00 +0000 UTC

    e := end.Unix()
    fmt.Printf("e is %v\n", e)
    //e is 1585162800

    fmt.Printf("now is %v\n", time.Now())
    //now  is 2020-03-26 16:34:53.1912054 +0800 CST m=+0.002021101

    fmt.Printf("now is %v\n", time.Now().Unix())
    //now  is 1585212169
}

代碼分析

  1. start 和 end是兩個(gè)時(shí)間字符串,并且沒有顯式聲明時(shí)區(qū)。
    當(dāng)使用time.Parse去解析start和end兩個(gè)時(shí)間字符串的時(shí)候,會(huì)默認(rèn)按照UTC時(shí)區(qū)去解析。
    所以可以看到輸出的結(jié)果在后面會(huì)有一個(gè)UTC,表示是UTC時(shí)間。
  2. end.Unix(),返回end的時(shí)間戳1585162800,在Unix時(shí)間戳工具里面查詢,可以看到1585162800對(duì)應(yīng)的是2020/3/26 3:0:0。
    原因:我的電腦的時(shí)區(qū)是東八區(qū)(也就是北京時(shí)間),endTime="2020-03-25 19:00:00"是UTC時(shí)間,對(duì)應(yīng)到我們本地時(shí)間自然要加8個(gè)小時(shí),也就是2020/3/26 3:0:0。
  3. time.Now(),可以看到,輸出的結(jié)果后面有 +0800 CST,這個(gè)就表示東八區(qū)的時(shí)間。

總結(jié)
時(shí)區(qū)問(wèn)題是很容易被忽視的問(wèn)題。今天在寫項(xiàng)目的時(shí)候就被時(shí)區(qū)問(wèn)題block了很長(zhǎng)時(shí)間。
建議使用時(shí)間的時(shí)候盡量統(tǒng)一使用UTC時(shí)間,能夠避免很多問(wèn)題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容