【问题标题】:Go: time.Parse() issue去:time.Parse() 问题
【发布时间】:2015-07-01 15:24:15
【问题描述】:

我有以下代码:

timeLocal := "01/July/2015:18:12:25 +0900"
inFormat := "02/January/2006:15:04:05 -0700"
parsed, err := time.Parse(inFormat, timeLocal)
if err != nil {
    log.Fatal("Time format was not recognized!")
}

现在,解析工作正常。但是当我运行时:

fmt.Println(timeLocal)
fmt.Println(inFormat)
fmt.Println(parsed)

输出是:

01/July/2015:18:12:25 +0900
02/January/2006:15:04:05 -0700
2015-07-01 18:12:25 +0900 +0900

第二个+0900 应该在那里吗?我在做什么愚蠢的事情?抱歉,这真是漫长的一天,我看不到我错过了什么。

哦,整个文件都在这里:

package main

import (
    "fmt"
    "time"
    "log"
)

func main() {
    timeLocal := "01/July/2015:18:12:25 +0900"
    inFormat := "02/January/2006:15:04:05 -0700"
    parsed, err := time.Parse(inFormat, timeLocal)
    if err != nil {
        log.Fatal("Time format was not recognized!")
    }

    fmt.Println(timeLocal)
    fmt.Println(inFormat)
    fmt.Println(parsed)
}

【问题讨论】:

    标签: parsing time go


    【解决方案1】:

    如果您查看time.Time 的文档,您将看到默认输出格式是什么:

    String 返回使用格式字符串格式化的时间:

    “2006-01-02 15:04:05.999999999 -0700 MST”

    现在您应该看到第二个+0900 在那里做了什么——这是一个位置(时区)名称。由于您的输入格式没有名称,它只会重复一个偏移量。

    您可以通过更改输入格式来解析位置名称来提供名称。或者,如果不需要,您可以提供不打印名称的输出格式。

    您修改后的示例:

    package main
    
    import (
        "fmt"
        "time"
        "log"
    )
    
    func main() {
        timeLocal := "01/July/2015:18:12:25 +0900 XYZ"
        inFormat := "02/January/2006:15:04:05 -0700 MST"
        parsed, err := time.Parse(inFormat, timeLocal)
        if err != nil {
            log.Fatal("Time format was not recognized!")
        }
    
        fmt.Println(timeLocal)
        fmt.Println(inFormat)
        fmt.Println(parsed) // 2015-07-01 18:12:25 +0900 XYZ
        fmt.Println(parsed.Format("02/January/2006:15:04:05 -0700"))
    }
    

    http://play.golang.org/p/xVGvlt-M5B

    【讨论】:

      【解决方案2】:

      Time.String 使用的默认格式是这样的:

      2006-01-02 15:04:05.999999999 -0700 MST
      

      注意“MST”部分。由于您没有提供区域的名称,因此格式只是“命名”它与偏移量相同,即“+0900”。如果将其更改为“+0000”,您会发现这确实是一个时区名称:

      2015-07-01 18:12:25 +0000 UTC
      

      如果您不想这样,只需使用单独的格式进行打印:

      myFmt := "2006-01-02 15:04:05.999999999 -0700"
      fmt.Println(parsed.Format(myFmt))
      

      【讨论】:

      • 有趣,我尝试将输入更改为+0000,它在操场上工作,但在我的系统上显示+0000 +0000。然后尝试使用+0200 并正确显示CEST。我猜这只有在偏移量与time.Local 匹配时才会翻译。很高兴知道!
      猜你喜欢
      • 2013-05-08
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-05
      • 1970-01-01
      • 2021-06-29
      • 1970-01-01
      相关资源
      最近更新 更多