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

Go每日一庫(kù)之dateparse處理時(shí)間

 更新時(shí)間:2021年07月05日 15:24:20   作者:darjun  
不管什么時(shí)候,處理時(shí)間總是讓人頭疼的一件事情。今天要介紹的dateparse實(shí)現(xiàn)解析日期時(shí)間格式的字符串。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

簡(jiǎn)介

不管什么時(shí)候,處理時(shí)間總是讓人頭疼的一件事情。因?yàn)闀r(shí)間格式太多樣化了,再加上時(shí)區(qū),夏令時(shí),閏秒這些細(xì)枝末節(jié)處理起來(lái)更是困難。所以在程序中,涉及時(shí)間的處理我們一般借助于標(biāo)準(zhǔn)庫(kù)或第三方提供的時(shí)間庫(kù)。今天要介紹的dateparse專注于一個(gè)很小的時(shí)間處理領(lǐng)域——解析日期時(shí)間格式的字符串。

快速使用

本文代碼使用 Go Modules。

創(chuàng)建目錄并初始化:

$ mkdir dateparse && cd dateparse
$ go mod init github.com/darjun/go-daily-lib/dateparse

安裝dateparse庫(kù):

$ go get -u github.com/araddon/dateparse

使用:

package main

import (
  "fmt"
  "log"
  "github.com/araddon/dateparse"
)

func main() {
  t1, err := dateparse.ParseAny("3/1/2014")
  if err != nil {
    log.Fatal(err)
  }
  fmt.Println(t1.Format("2006-01-02 15:04:05"))

  t2, err := dateparse.ParseAny("mm/dd/yyyy")
  if err != nil {
    log.Fatal(err)
  }
  fmt.Println(t2.Format("2006-01-02 15:04:05"))
}

ParseAny()方法接受一個(gè)日期時(shí)間字符串,解析該字符串,返回time.Time類型的值。如果傳入的字符串dateparse庫(kù)無(wú)法識(shí)別,則返回一個(gè)錯(cuò)誤。上面程序運(yùn)行輸出:

$ go run main.go
2014-03-01 00:00:00
2021/06/24 14:52:39 Could not find format for "mm/dd/yyyy"
exit status 1

需要注意,當(dāng)我們寫出"3/1/2014"這個(gè)時(shí)間的時(shí)候,可以解釋為2014年3月1日,也可以解釋為2014年1月3日。這就存在二義性,dateparse默認(rèn)采用mm/dd/yyyy這種格式,也就是2014年3月1日。我們也可以使用ParseStrict()函數(shù)讓這種具有二義性的字符串解析失敗:

func main() {
  t, err := dateparse.ParseStrict("3/1/2014")
  if err != nil {
    log.Fatal(err)
  }
  fmt.Println(t.Format("2006-01-02 15:04:05"))
}

運(yùn)行:

$ go run main.go
2021/06/24 14:57:18 This date has ambiguous mm/dd vs dd/mm type format
exit status 1

格式

dateparse支持豐富的日期時(shí)間格式,基本囊括了所有常用的格式。它支持標(biāo)準(zhǔn)庫(kù)time中預(yù)定義的所有格式:

// src/time/format.go
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"
)

支持的完整格式查看dateparse README。

時(shí)區(qū)

dateparse支持在特定時(shí)區(qū)解析日期時(shí)間字符串。我們可以通過(guò)調(diào)用標(biāo)準(zhǔn)庫(kù)的time.LoadLocation()方法,傳入時(shí)區(qū)標(biāo)識(shí)字符串來(lái)獲得時(shí)區(qū)對(duì)象。時(shí)區(qū)標(biāo)識(shí)字符串是類似Asia/Shanghai,America/Chicago這樣的格式,它表示一個(gè)具體的時(shí)區(qū),前者上海,后者洛杉磯。調(diào)用dateparse.ParseIn()方法傳入時(shí)區(qū)對(duì)象,在指定時(shí)區(qū)中解析。time包中還預(yù)定義了兩個(gè)時(shí)區(qū)對(duì)象,time.Local表示本地時(shí)區(qū),time.UTC表示 UTC 時(shí)區(qū)。時(shí)區(qū)的權(quán)威數(shù)據(jù)請(qǐng)看IANA。

func main() {
  tz1, _ := time.LoadLocation("America/Chicago")
  t1, _ := dateparse.ParseIn("2021-06-24 15:50:30", tz1)
  fmt.Println(t1.Local().Format("2006-01-02 15:04:05"))

  t2, _ := dateparse.ParseIn("2021-06-24 15:50:30", time.Local)
  fmt.Println(t2.Local().Format("2006-01-02 15:04:05"))
}

運(yùn)行:

$ go run main.go
2021-06-25 04:50:30
2021-06-24 15:50:30

美國(guó)洛杉磯時(shí)區(qū)的"2021年6月24日 15時(shí)30分30秒"等于本地時(shí)區(qū)(北京時(shí)間)的"2021年6月25日 04時(shí)50分30秒"。

cli

dateparse還提供了一個(gè)命令行工具,用于極快地查看日期時(shí)間格式。安裝:

$ go install github.com/araddon/dateparse/dateparse

默認(rèn)會(huì)安裝在$GOPATH路徑下,我習(xí)慣上把$GOPATH/bin放到$PATH中。所以dateparse命令可以直接使用。
dateparse命令接收一個(gè)字符串,和一個(gè)可選的時(shí)區(qū)選項(xiàng):

$ dateparse --timezone="Asia/Shanghai" "2021-06-24 06:46:08"

Your Current time.Local zone is CST

Layout String: dateparse.ParseFormat() => 2006-01-02 15:04:05

Your Using time.Local set to location=Asia/Shanghai CST

+-------------+---------------------------+-------------------------------+-------------------------------------+
| method      | Zone Source               | Parsed                        | Parsed: t.In(time.UTC)              |
+-------------+---------------------------+-------------------------------+-------------------------------------+
| ParseAny    | time.Local = nil          | 2021-06-24 06:46:08 +0000 UTC | 2021-06-24 06:46:08 +0000 UTC day=4 |
| ParseAny    | time.Local = timezone arg | 2021-06-24 06:46:08 +0000 UTC | 2021-06-24 06:46:08 +0000 UTC day=4 |
| ParseAny    | time.Local = time.UTC     | 2021-06-24 06:46:08 +0000 UTC | 2021-06-24 06:46:08 +0000 UTC day=4 |
| ParseIn     | time.Local = nil          | 2021-06-24 06:46:08 +0000 UTC | 2021-06-24 06:46:08 +0000 UTC       |
| ParseIn     | time.Local = timezone arg | 2021-06-24 06:46:08 +0800 CST | 2021-06-23 22:46:08 +0000 UTC       |
| ParseIn     | time.Local = time.UTC     | 2021-06-24 06:46:08 +0000 UTC | 2021-06-24 06:46:08 +0000 UTC       |
| ParseLocal  | time.Local = nil          | 2021-06-24 06:46:08 +0000 UTC | 2021-06-24 06:46:08 +0000 UTC       |
| ParseLocal  | time.Local = timezone arg | 2021-06-24 06:46:08 +0800 CST | 2021-06-23 22:46:08 +0000 UTC       |
| ParseLocal  | time.Local = time.UTC     | 2021-06-24 06:46:08 +0000 UTC | 2021-06-24 06:46:08 +0000 UTC       |
| ParseStrict | time.Local = nil          | 2021-06-24 06:46:08 +0000 UTC | 2021-06-24 06:46:08 +0000 UTC       |
| ParseStrict | time.Local = timezone arg | 2021-06-24 06:46:08 +0000 UTC | 2021-06-24 06:46:08 +0000 UTC       |
| ParseStrict | time.Local = time.UTC     | 2021-06-24 06:46:08 +0000 UTC | 2021-06-24 06:46:08 +0000 UTC       |
+-------------+---------------------------+-------------------------------+-------------------------------------+

輸出當(dāng)前本地時(shí)區(qū),格式字符串(可用于生成同樣格式的日期時(shí)間字符串)和一個(gè)表格。表格里面的數(shù)據(jù)是分別對(duì)ParseAny/ParseIn/ParseLocal/ParseStrict在不同的時(shí)區(qū)下調(diào)用的結(jié)果。

method列表示調(diào)用的方法,Zone Source列表示將本地時(shí)區(qū)設(shè)置的值,Parsed列是以日期時(shí)間字符串調(diào)用ParseAny()返回的time.Time對(duì)象的Format()方法調(diào)用結(jié)果,Parsed: t.In(time.UTC)列在返回的time.Time對(duì)象調(diào)用Format()方法前將其轉(zhuǎn)為 UTC 時(shí)間。

由于ParseAny/ParseStrict不會(huì)考慮本地時(shí)區(qū),都是在 UTC 下解析字符串,所以這 6 行的最后兩列結(jié)果都一樣。

ParseIn的第二行,將time.Local設(shè)置為我們通過(guò)命令行選項(xiàng)設(shè)置的時(shí)區(qū),上面我設(shè)置為Asia/Shanghai,對(duì)應(yīng)的 UTC 時(shí)間相差 8 小時(shí)。ParseLocal也是如此。

下面是dateparse命令行的部分源碼,可以對(duì)照查看:

func main() {
  parsers := map[string]parser{
    "ParseAny":    parseAny,
    "ParseIn":     parseIn,
    "ParseLocal":  parseLocal,
    "ParseStrict": parseStrict,
  }

  for name, parser := range parsers {
    time.Local = nil
    table.AddRow(name, "time.Local = nil", parser(datestr, nil, false), parser(datestr, nil, true))
    if timezone != "" {
      time.Local = loc
      table.AddRow(name, "time.Local = timezone arg", parser(datestr, loc, false), parser(datestr, loc, true))
    }
    time.Local = time.UTC
    table.AddRow(name, "time.Local = time.UTC", parser(datestr, time.UTC, false), parser(datestr, time.UTC, true))
  }
}

func parseIn(datestr string, loc *time.Location, utc bool) string {
  t, err := dateparse.ParseIn(datestr, loc)
  if err != nil {
    return err.Error()
  }
  if utc {
    return t.In(time.UTC).String()
  }
  return t.String()
}

注意輸出的本地時(shí)區(qū)為 CST,它可以代表不同的時(shí)區(qū):

Central Standard Time (USA) UT-6:00
Central Standard Time (Australia) UT+9:30
China Standard Time UT+8:00
Cuba Standard Time UT-4:00

CST 可以同時(shí)表示美國(guó)、澳大利亞、中國(guó)和古巴四個(gè)國(guó)家的標(biāo)準(zhǔn)時(shí)間。

總結(jié)

使用dateparse可以很方便地從日期時(shí)間字符串中解析出時(shí)間對(duì)象和格式(layout)。同時(shí)dateparse命令行可以快速的查看和轉(zhuǎn)換相應(yīng)時(shí)區(qū)的時(shí)間,是一個(gè)非常不錯(cuò)的小工具。

大家如果發(fā)現(xiàn)好玩、好用的 Go 語(yǔ)言庫(kù),歡迎到 Go 每日一庫(kù) GitHub 上提交 issue😄

參考

dateparse GitHub:https://github.com/araddon/dateparse
Go 每日一庫(kù) GitHub:https://github.com/darjun/go-daily-lib

到此這篇關(guān)于Go每日一庫(kù)之dateparse處理時(shí)間的文章就介紹到這了,更多相關(guān)Go dateparse處理時(shí)間內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang進(jìn)行簡(jiǎn)單權(quán)限認(rèn)證的實(shí)現(xiàn)

    golang進(jìn)行簡(jiǎn)單權(quán)限認(rèn)證的實(shí)現(xiàn)

    本文主要介紹了golang簡(jiǎn)單權(quán)限認(rèn)證的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Go語(yǔ)言字符串處理庫(kù)strings包詳解

    Go語(yǔ)言字符串處理庫(kù)strings包詳解

    本文詳細(xì)介紹了Go語(yǔ)言中的strings庫(kù)的使用方法,包括字符串的查找、替換、分割、比較、大小寫轉(zhuǎn)換等操作,strings庫(kù)是Go語(yǔ)言中非常重要且功能豐富的標(biāo)準(zhǔn)庫(kù),幾乎涵蓋了所有字符串處理的需求
    2024-09-09
  • GO語(yǔ)言開(kāi)發(fā)終端命令行小工具改進(jìn)更新

    GO語(yǔ)言開(kāi)發(fā)終端命令行小工具改進(jìn)更新

    這篇文章主要為大家介紹了GO語(yǔ)言開(kāi)發(fā)終端命令行小工具的改進(jìn)更新,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • 深入解析Go語(yǔ)言的io.ioutil標(biāo)準(zhǔn)庫(kù)使用

    深入解析Go語(yǔ)言的io.ioutil標(biāo)準(zhǔn)庫(kù)使用

    這篇文章主要介紹了Go語(yǔ)言的io.ioutil標(biāo)準(zhǔn)庫(kù)使用,是Golang入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-10-10
  • 詳解Go如何基于現(xiàn)有的context創(chuàng)建新的context

    詳解Go如何基于現(xiàn)有的context創(chuàng)建新的context

    在?Golang?中,context?包提供了創(chuàng)建和管理上下文的功能,那么在GO語(yǔ)言中如何基于現(xiàn)有的context創(chuàng)建新的context,下面小編就來(lái)和大家詳細(xì)聊聊
    2024-01-01
  • Go語(yǔ)言執(zhí)行cmd命令庫(kù)的方法實(shí)現(xiàn)

    Go語(yǔ)言執(zhí)行cmd命令庫(kù)的方法實(shí)現(xiàn)

    go語(yǔ)言用來(lái)執(zhí)行一個(gè)系統(tǒng)的命令相對(duì)python來(lái)說(shuō)還是有點(diǎn)復(fù)雜的,執(zhí)行命令是一個(gè)非常常見(jiàn)的需求,本文主要介紹了Go語(yǔ)言執(zhí)行cmd命令庫(kù)的方法實(shí)現(xiàn),感興趣的可以了解一下
    2023-09-09
  • golang中的空slice案例

    golang中的空slice案例

    這篇文章主要介紹了golang中的空slice案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • Go語(yǔ)言定時(shí)任務(wù)的實(shí)現(xiàn)示例

    Go語(yǔ)言定時(shí)任務(wù)的實(shí)現(xiàn)示例

    本文主要介紹了Go語(yǔ)言定時(shí)任務(wù)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Go語(yǔ)言實(shí)現(xiàn)多協(xié)程文件下載器的過(guò)程詳解

    Go語(yǔ)言實(shí)現(xiàn)多協(xié)程文件下載器的過(guò)程詳解

    這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)多協(xié)程文件下載器的相關(guān)資料,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-08-08
  • Golang使用CopyIn進(jìn)行批量創(chuàng)建的示例代碼

    Golang使用CopyIn進(jìn)行批量創(chuàng)建的示例代碼

    本文主要介紹了Golang使用CopyIn進(jìn)行批量創(chuàng)建的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07

最新評(píng)論

仁寿县| 长子县| 馆陶县| 凤冈县| 奉贤区| 托里县| 关岭| 黄山市| 界首市| 阜新| 舟曲县| 喀什市| 吉首市| 大厂| 文安县| 东源县| 瑞金市| 南澳县| 寿阳县| 永丰县| 蕉岭县| 犍为县| 寿光市| 吉木萨尔县| 罗平县| 禹城市| 龙口市| 陆丰市| 泰和县| 河北区| 嘉义市| 长白| 梅州市| 宿松县| 高淳县| 北流市| 和政县| 桂平市| 隆林| 六安市| 儋州市|