最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang時(shí)間、時(shí)區(qū)、格式的使用方法

 更新時(shí)間:2019年04月01日 10:38:18   作者:alex_023  
這篇文章主要介紹了golang時(shí)間、時(shí)區(qū)、格式的使用方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧

前幾天,因?yàn)樾枰獙?shí)現(xiàn)海外服務(wù)端定時(shí)停機(jī),涉及到時(shí)區(qū)的概念。網(wǎng)上搜索了一下,大部分都是談time.Format中的Layout,非常不成體系,這里就簡(jiǎn)單總結(jié)一下其中的時(shí)間初始化、時(shí)區(qū)轉(zhuǎn)化及格式轉(zhuǎn)換。

開發(fā)中,我們對(duì)時(shí)間的使用是比較多的,其應(yīng)用場(chǎng)景,按照使用概率,從大到小,通常是:

  1. 獲取當(dāng)前或數(shù)據(jù)庫(kù)中存儲(chǔ)的時(shí)間
  2. 比較兩個(gè)時(shí)間點(diǎn)的先后
  3. 顯示打印時(shí)間
  4. 時(shí)區(qū)轉(zhuǎn)換

對(duì)應(yīng)到go,也就是幾個(gè)基本定義:

  1. 時(shí)間點(diǎn)與時(shí)間段:Time,Duration。好比MVC中的M。
  2. 時(shí) 區(qū):Location,在時(shí)間轉(zhuǎn)換上,好比是MVC中的C。
  3. 格式化:Format的layout定義,好比MVC中的V。

單獨(dú)就Duration沒什么好談的,使用非常簡(jiǎn)單。Time實(shí)例中的Add、Sub與其相關(guān),非常容易上手,就不再多說(shuō)。

時(shí)區(qū)

時(shí)區(qū)是時(shí)間運(yùn)算非常重要的概念,特別強(qiáng)調(diào)與layout是兩個(gè)完全不同的概念。go語(yǔ)言通過Location來(lái)作為時(shí)區(qū)的運(yùn)行實(shí)例,同一時(shí)刻轉(zhuǎn)換成為不同的時(shí)區(qū),就需要通過不同的Location來(lái)進(jìn)行。默認(rèn)情況下,采用UTC(unix標(biāo)準(zhǔn)時(shí)間),而不是過去式的GMT(格林尼治標(biāo)準(zhǔn)時(shí)間)。

以下代碼展示了UTC標(biāo)準(zhǔn)、北京、美國(guó)洛杉磯在同一時(shí)刻的轉(zhuǎn)換:

  now := time.Now()
  local1, err1 := time.LoadLocation("") //等同于"UTC"
  if err1 != nil {
    fmt.Println(err1)
  }
  local2, err2 := time.LoadLocation("Local")//服務(wù)器設(shè)置的時(shí)區(qū)
  if err2 != nil {
    fmt.Println(err2)
  }
  local3, err3 := time.LoadLocation("America/Los_Angeles")
  if err3 != nil {
    fmt.Println(err3)
  }

  fmt.Println(now.In(local1))
  fmt.Println(now.In(local2))
  fmt.Println(now.In(local3))
  //output:
  //2016-12-04 07:39:06.270473069 +0000 UTC
  //2016-12-04 15:39:06.270473069 +0800 CST
  //2016-12-03 23:39:06.270473069 -0800 PST

代碼中,LoadLocation的輸入?yún)?shù)的取值,除了該函數(shù)的源代碼中可看到的”UTC”、”Local”,其余的值其實(shí)是遵照“IANA Time Zone”的規(guī)則,可以解壓$GOROOT/lib/time/zoneinfo.zip 這個(gè)文件打開查看。在Asia這個(gè)目錄,我看到了Chongqing,Hong_Kong,但沒Beijing。在國(guó)外獲取中國(guó)北京時(shí)間,要用”PRC”,當(dāng)然”Asia/Chongqing”也是個(gè)方法:

loc, _:= time.LoadLocation("Asia/Chongqing")  //參數(shù)就是解壓文件的“目錄”+“/”+“文件名”。
fmt.Println(time.Now().In(loc))

值得強(qiáng)調(diào)的是,Location僅用于時(shí)區(qū)轉(zhuǎn)化,而不對(duì)time內(nèi)部的數(shù)據(jù)產(chǎn)生影響(內(nèi)部其實(shí)是unix標(biāo)準(zhǔn)時(shí)),因此,當(dāng)幾個(gè)time實(shí)例進(jìn)行Add、Sub的時(shí)候,不用關(guān)注Location是否相同。

時(shí)間格式化

前面例子中,打印結(jié)果非常丑陋,通常沒人關(guān)心秒之后的ns;明確時(shí)區(qū)后,很少需要與UTC的時(shí)差。這時(shí)候,就需要定義我們的layout了。

網(wǎng)上好多都說(shuō),“2006-01-02 15:04:05是go的誕生時(shí)間,所以這么設(shè)計(jì)Format的Layout”,應(yīng)該不是真的。請(qǐng)看下表:

01/Jan 02 03/15 04 05 06 -07[00][:00] PM Mon
時(shí) 時(shí)差 上下午 星期幾

也就是1234567,分別對(duì)應(yīng):月日時(shí)分秒年 時(shí)差,很好記憶。只是稍微注意一下:

  • 月:01或Jan都可以
  • 小時(shí):03表示12小時(shí)制,15表示24小時(shí)制。
  • 時(shí)差:是 -07 ,不是 07,后邊可以增加“00”或“:00”,表示更進(jìn)一步的分秒時(shí)差。
  • 上下午:使用PM,不是AM。
  • 擺放順序:隨意,甚至重復(fù)都可以。源代碼包也有定義的常用格式供使用。

也許是因?yàn)?6對(duì)應(yīng)的“年”與go的項(xiàng)目啟動(dòng)時(shí)間差不多,也就有了網(wǎng)上的誤傳。在源代碼time/time.go中,有非常明確的描述,粘貼一下,就不翻譯了:

// These are predefined layouts for use in Time.Format and Time.Parse.
// The reference time used in the layouts is the specific time:
// Mon Jan 2 15:04:05 MST 2006
// which is Unix time 1136239445. Since MST is GMT-0700,
// the reference time can be thought of as
// 01/02 03:04:05PM ‘06 -0700

雖然go已經(jīng)提供了10多個(gè)常用格式:

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"
)

但個(gè)人習(xí)慣還是“2006-01-02 15:04:05 Mon”,之前代碼稍加修改,就是這樣:

  formate:="2006-01-02 15:04:05 Mon"
  now := time.Now()
  local1, err1 := time.LoadLocation("UTC") //輸入?yún)?shù)"UTC",等同于""
  if err1 != nil {
    fmt.Println(err1)
  }
  local2, err2 := time.LoadLocation("Local")
  if err2 != nil {
    fmt.Println(err2)
  }
  local3, err3 := time.LoadLocation("America/Los_Angeles")
  if err3 != nil {
    fmt.Println(err3)
  }

  fmt.Println(now.In(local1).Format(formate))
  fmt.Println(now.In(local2).Format(formate))
  fmt.Println(now.In(local3).Format(formate))
  //output:
  //2016-12-04 08:06:39 Sun
  //2016-12-04 16:06:39 Sun
  //2016-12-04 00:06:39 Sun

時(shí)間初始化

除了最常用的time.Now,go還提供了通過unix標(biāo)準(zhǔn)時(shí)間、字符串兩種方式來(lái)初始化:

//通過字符串,默認(rèn)UTC時(shí)區(qū)初始化Time
func Parse(layout, value string) (Time, error) 
//通過字符串,指定時(shí)區(qū)來(lái)初始化Time
func ParseInLocation(layout, value string, loc *Location) (Time, error) 

//通過unix 標(biāo)準(zhǔn)時(shí)間初始化Time
func Unix(sec int64, nsec int64) Time 

時(shí)間初始化的時(shí)候,一定要注意原始輸入值的時(shí)區(qū)。正好手里有一個(gè)變量,洛杉磯當(dāng)?shù)貢r(shí)間“2016-11-28 19:36:25”,unix時(shí)間精確到秒為1480390585。將其解析出來(lái)的代碼如下:

  local, _ := time.LoadLocation("America/Los_Angeles")
  timeFormat := "2006-01-02 15:04:05"
  //func Unix(sec int64, nsec int64) Time {
  time1 := time.Unix(1480390585, 0)                           //通過unix標(biāo)準(zhǔn)時(shí)間的秒,納秒設(shè)置時(shí)間
  time2, _ := time.ParseInLocation(timeFormat, "2016-11-28 19:36:25", local) //洛杉磯時(shí)間
  fmt.Println(time1.In(local).Format(timeFormat))
  fmt.Println(time2.In(local).Format(timeFormat))
  chinaLocal, _ := time.LoadLocation("Local")//運(yùn)行時(shí),該服務(wù)器必須設(shè)置為中國(guó)時(shí)區(qū),否則最好是采用"Asia/Chongqing"之類具體的參數(shù)。
  fmt.Println(time2.In(chinaLocal).Format(timeFormat))
  //output:
  //2016-11-28 19:36:25
  //2016-11-28 19:36:25
  //2016-11-29 11:36:25

當(dāng)然,如果輸入值是字符串,且?guī)в袝r(shí)區(qū)

“2016-12-04 15:39:06 +0800 CST”

則不需要采用ParseInLocation方法,直接使用Parse即可。

當(dāng)然,其他time包中的函數(shù)還有很多,但網(wǎng)上已經(jīng)有很多描述,就不再啰嗦。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 手把手教你導(dǎo)入Go語(yǔ)言第三方庫(kù)

    手把手教你導(dǎo)入Go語(yǔ)言第三方庫(kù)

    本文主要介紹了手把手教你導(dǎo)入Go語(yǔ)言第三方庫(kù),通過導(dǎo)入gin包來(lái)深入學(xué)習(xí),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Golang?channel為什么不會(huì)阻塞的原因詳解

    Golang?channel為什么不會(huì)阻塞的原因詳解

    這篇文章主要為大家介紹了Golang?channel為什么不會(huì)阻塞的原因詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 手把手帶你走進(jìn)Go語(yǔ)言之循環(huán)語(yǔ)句

    手把手帶你走進(jìn)Go語(yǔ)言之循環(huán)語(yǔ)句

    在不少實(shí)際問題中有許多具有規(guī)律性的重復(fù)操作,因此在程序中就需要重復(fù)執(zhí)行某些語(yǔ)句。一組被重復(fù)執(zhí)行的語(yǔ)句稱之為循環(huán)體,能否繼續(xù)重復(fù),決定循環(huán)的終止條件,本文給大家介紹的非常詳細(xì),跟著小編往下看吧
    2021-09-09
  • golang sql語(yǔ)句超時(shí)控制方案及原理

    golang sql語(yǔ)句超時(shí)控制方案及原理

    一般應(yīng)用程序在執(zhí)行一條sql語(yǔ)句時(shí),都會(huì)給這條sql設(shè)置一個(gè)超時(shí)時(shí)間,本文主要介紹了golang sql語(yǔ)句超時(shí)控制方案及原理,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • golang新手們?nèi)菀追傅?個(gè)錯(cuò)誤總結(jié)

    golang新手們?nèi)菀追傅?個(gè)錯(cuò)誤總結(jié)

    這篇文章主要給大家介紹了關(guān)于golang新手們?nèi)菀追傅?個(gè)錯(cuò)誤,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • 詳解Go語(yǔ)言中單鏈表的使用

    詳解Go語(yǔ)言中單鏈表的使用

    鏈表由一系列結(jié)點(diǎn)(鏈表中每一個(gè)元素稱為結(jié)點(diǎn))組成,結(jié)點(diǎn)可以在運(yùn)行時(shí)動(dòng)態(tài)生成。本文將通過實(shí)例為大家詳解Go語(yǔ)言中單鏈表的常見用法,感興趣的可以了解一下
    2022-08-08
  • Golang正整數(shù)指定規(guī)則排序算法問題分析

    Golang正整數(shù)指定規(guī)則排序算法問題分析

    這篇文章主要介紹了Golang正整數(shù)指定規(guī)則排序算法問題,結(jié)合實(shí)例形式分析了Go語(yǔ)言排序算法操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2017-01-01
  • Golang 讀取并解析SQL文件的實(shí)現(xiàn)方法

    Golang 讀取并解析SQL文件的實(shí)現(xiàn)方法

    本文介紹了如何使用Go語(yǔ)言編寫一個(gè)簡(jiǎn)單的函數(shù),用于讀取并解析SQL文件,通過一個(gè)函數(shù),我們可以輕松地將SQL文件中的語(yǔ)句提取出來(lái),進(jìn)行后續(xù)的操作,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • 詳解Golang如何監(jiān)聽某個(gè)函數(shù)的開始執(zhí)行和執(zhí)行結(jié)束

    詳解Golang如何監(jiān)聽某個(gè)函數(shù)的開始執(zhí)行和執(zhí)行結(jié)束

    這篇文章主要為大家詳細(xì)介紹了Golang如何監(jiān)聽某個(gè)函數(shù)的開始執(zhí)行和執(zhí)行結(jié)束,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下
    2024-02-02
  • golang time常用方法詳解

    golang time常用方法詳解

    這篇文章主要介紹了golang time常用方法詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08

最新評(píng)論

奉化市| 北宁市| 通化市| 商都县| 沁水县| 东港市| 呈贡县| 临汾市| 柘城县| 大连市| 佳木斯市| 五寨县| 浮梁县| 阳江市| 天气| 东乌珠穆沁旗| 曲水县| 博客| 清苑县| 门源| 娱乐| 岳普湖县| 莎车县| 班玛县| 昂仁县| 彰武县| 收藏| 鹤庆县| 万安县| 闵行区| 乌鲁木齐县| 铜山县| 海宁市| 修文县| 莆田市| 碌曲县| 瑞昌市| 桐梓县| 西和县| 琼结县| 清苑县|