91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go的dateparse處理時間

發布時間:2021-07-05 18:35:20 來源:億速云 閱讀:150 作者:chen 欄目:開發技術

這篇文章主要講解了“Go的dateparse處理時間”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Go的dateparse處理時間”吧!

目錄
  • 簡介

  • 快速使用

  • 格式

  • 時區

  • cli

  • 總結

簡介

不管什么時候,處理時間總是讓人頭疼的一件事情。因為時間格式太多樣化了,再加上時區,夏令時,閏秒這些細枝末節處理起來更是困難。所以在程序中,涉及時間的處理我們一般借助于標準庫或第三方提供的時間庫。今天要介紹的dateparse專注于一個很小的時間處理領域——解析日期時間格式的字符串。

快速使用

本文代碼使用 Go Modules。

創建目錄并初始化:

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

安裝dateparse庫:

$ 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()方法接受一個日期時間字符串,解析該字符串,返回time.Time類型的值。如果傳入的字符串dateparse庫無法識別,則返回一個錯誤。上面程序運行輸出:

$ 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

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

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

運行:

$ 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支持豐富的日期時間格式,基本囊括了所有常用的格式。它支持標準庫time中預定義的所有格式:

// 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。

時區

dateparse支持在特定時區解析日期時間字符串。我們可以通過調用標準庫的time.LoadLocation()方法,傳入時區標識字符串來獲得時區對象。時區標識字符串是類似Asia/Shanghai,America/Chicago這樣的格式,它表示一個具體的時區,前者上海,后者洛杉磯。調用dateparse.ParseIn()方法傳入時區對象,在指定時區中解析。time包中還預定義了兩個時區對象,time.Local表示本地時區,time.UTC表示 UTC 時區。時區的權威數據請看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"))
}

運行:

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

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

cli

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

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

默認會安裝在$GOPATH路徑下,我習慣上把$GOPATH/bin放到$PATH中。所以dateparse命令可以直接使用。
dateparse命令接收一個字符串,和一個可選的時區選項:

$ 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       |
+-------------+---------------------------+-------------------------------+-------------------------------------+

輸出當前本地時區,格式字符串(可用于生成同樣格式的日期時間字符串)和一個表格。表格里面的數據是分別對ParseAny/ParseIn/ParseLocal/ParseStrict在不同的時區下調用的結果。

method列表示調用的方法,Zone Source列表示將本地時區設置的值,Parsed列是以日期時間字符串調用ParseAny()返回的time.Time對象的Format()方法調用結果,Parsed: t.In(time.UTC)列在返回的time.Time對象調用Format()方法前將其轉為 UTC 時間。

由于ParseAny/ParseStrict不會考慮本地時區,都是在 UTC 下解析字符串,所以這 6 行的最后兩列結果都一樣。

ParseIn的第二行,將time.Local設置為我們通過命令行選項設置的時區,上面我設置為Asia/Shanghai,對應的 UTC 時間相差 8 小時。ParseLocal也是如此。

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

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()
}

注意輸出的本地時區為 CST,它可以代表不同的時區:

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 可以同時表示美國、澳大利亞、中國和古巴四個國家的標準時間。

總結

使用dateparse可以很方便地從日期時間字符串中解析出時間對象和格式(layout)。同時dateparse命令行可以快速的查看和轉換相應時區的時間,是一個非常不錯的小工具。

感謝各位的閱讀,以上就是“Go的dateparse處理時間”的內容了,經過本文的學習后,相信大家對Go的dateparse處理時間這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

go
AI

尚志市| 阿鲁科尔沁旗| 图们市| 会宁县| 改则县| 贺兰县| 子洲县| 仲巴县| 沂源县| 沙田区| 扶沟县| 嘉义市| 肥东县| 石阡县| 原平市| 利辛县| 海口市| 托里县| 土默特左旗| 玛曲县| 黄大仙区| 新建县| 仁化县| 青河县| 奉化市| 安福县| 莲花县| 杭州市| 大连市| 鄂托克前旗| 竹山县| 金坛市| 历史| 和田市| 壤塘县| 沁阳市| 崇明县| 临西县| 远安县| 米脂县| 瑞金市|