亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Go 中解析日期

在 Go 中解析日期

Go
米脂 2021-12-27 15:17:55
我正在用 Go 編寫一個服務,它將時間戳作為 HTTP 請求參數傳入并解析它。示例調用是 GET /values?from=2015-02-11T15:01:00+00:00傳遞給函數的值的一個例子是2015-02-11T15:01:00+00:00。我試圖這樣解析它:dateTime := request.URL.Query.Get("from")layout := "2006-01-02T15:04:05Z07:00"formattedTime, _ := time.Parse(layout, dateTime)(我正在使用 Go 的布局編號來執行此操作 - 此處提供更多信息:https : //golang.org/pkg/time/#pkg-constants)但是,由此產生的輸出是0001-01-01 00:00:00 +0000 UTC.我還應該指出,當我執行 a 時fmt.Println(dateTime),我得到了2015-02-11T15:01:00 00:00(不像2015-02-11T15:01:00+00:00我預期的那樣)。此外,當我將日期時間硬編碼到函數中并使用 time.Parse(layout, dateTime) 對其進行解析時,它會成功解析并提供輸出2015-02-11 15:01:00 +000 GMT。有誰知道這里可能發生什么?
查看完整描述

2 回答

?
浮云間

TA貢獻1829條經驗 獲得超4個贊

您應該檢查返回的錯誤。time.Parse()返回錯誤:


formattedTime, err := time.Parse(layout, dateTime)

if err != nil {

    fmt.Println(err)

}

您的錯誤將在于'+'URL 查詢中的字符。URL 查詢使用URL 編碼,其中+符號是特殊的:它用于對空格字符進行編碼。所以當你這樣做時:


dateTime := request.URL.Query.Get("from")

您dateTime將包含解碼后的值,其中+將被空格替換。檢查它像:


fmt.Printf("%q\n", dateTime)

輸出:


"2015-02-11T15:01:00 00:00"

當然,這不是您指定的布局的有效格式,這會給您帶來以下錯誤:


解析時間“2015-02-11T15:01:00 00:00”為“2006-01-02T15:04:05Z07:00”:無法將“”解析為“Z07:00”


您必須%2B在 URL 查詢中使用+標志代碼,并且還必須包含Z您在布局中使用的字符:


GET /values?from=2015-02-11T15:01:00Z%2B00:00

還要注意,布局必須包含-07:00參考時區,而不是07:00:


layout := "2006-01-02T15:04:05Z-07:00"

然后輸出(formattedTime):


2015-02-11 15:01:00 +0000 UTC

在Go Playground上試試:


如果必須+在查詢中使用...

如果您必須使用+查詢(正如您在評論中聲稱的那樣),那么使用未轉義的值會很棘手,就好像查詢中的時區是+,它被替換為空格,但如果時區是-,則不是!


一種方法是使用原始查詢而不是解碼的查詢。這在URL.RawQuery.


下面是它假設只有1請求參數的解決方案:"from="。如果還有其他則失敗,請考慮:


param := "from="

layout := "2006-01-02T15:04:05-07:00"

length := len(param) + len(layout)


if s := request.URL.RawQuery; len(s) < length || !strings.HasPrefix(s, param) {

     // unexpected query

}

dateTime := request.URL.RawQuery[len(param):length]

formattedTime, err := time.Parse(layout, dateTime)

if err != nil {

    // handle error

}


查看完整回答
反對 回復 2021-12-27
?
慕的地8271018

TA貢獻1796條經驗 獲得超4個贊

您需要在時區偏移之前使用減號,因此布局應為:“2006-01-02T15:04:05-07:00”


https://golang.org/pkg/time/#pkg-constants:


Numeric time zone offsets format as follows:


-0700  ±hhmm

-07:00 ±hh:mm

-07    ±hh

示例:http : //play.golang.org/p/ZG979Meuxz


當你打印出來時,它使用默認格式,而不是你用來解析它的格式,因為它調用了 String 方法:https : //golang.org/pkg/time/#Time.String


要使用自定義格式對其進行格式化,請使用格式:https : //golang.org/pkg/time/#Time.Format


查看完整回答
反對 回復 2021-12-27
  • 2 回答
  • 0 關注
  • 198 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號