解析不是“标准”格式的日期/时间字符串

新手上路,请多包涵

如何在 Go 中解析非标准日期/时间字符串。例如,如果我想将字符串 10/15/1983 转换为 time.Timetime.Parse() 函数应该允许您指定一种格式。

http://play.golang.org/p/v5DbowXt1x

 package main

import "fmt"
import "time"

func main() {
    test, err := time.Parse("10/15/1983", "10/15/1983")
    if err != nil {
        panic(err)
    }

    fmt.Println(test)
}

这会导致恐慌。

panic: parsing time "10/15/1983" as "10/15/1983": cannot parse "" as "0/"

从逻辑上讲,这是有道理的,因为它应该如何知道哪天和哪月。

其他语言有类似下面的功能:

parse("mm/dd/yyyy", "10/15/1983")

我在 Go 文档中找不到这样的函数,我唯一的选择是正则表达式吗?

原文由 Nucleon 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 410
2 个回答

time.Parse 正在寻找一些关键值。

通过改变:

 test, err := time.Parse("10/15/1983", "10/15/1983")

test, err := time.Parse("01/02/2006", "10/15/1983")

解析器会识别它。

是操场上修改后的代码

 package main

import "fmt"
import "time"

func main() {
    test, err := time.Parse("01/02/2006", "10/15/1983")
    if err != nil {
        panic(err)
    }

    fmt.Println(test)
}

您可以利用 src/pkg/time/format.go 文件中的常量列表来创建您自己的解析格式。

 const (
    stdLongMonth      = "January"
    stdMonth          = "Jan"
    stdNumMonth       = "1"
    stdZeroMonth      = "01"
    stdLongWeekDay    = "Monday"
    stdWeekDay        = "Mon"
    stdDay            = "2"
    stdUnderDay       = "_2"
    stdZeroDay        = "02"
    stdHour           = "15"
    stdHour12         = "3"
    stdZeroHour12     = "03"
    stdMinute         = "4"
    stdZeroMinute     = "04"
    stdSecond         = "5"
    stdZeroSecond     = "05"
    stdLongYear       = "2006"
    stdYear           = "06"
    stdPM             = "PM"
    stdpm             = "pm"
    stdTZ             = "MST"
    stdISO8601TZ      = "Z0700"  // prints Z for UTC
    stdISO8601ColonTZ = "Z07:00" // prints Z for UTC
    stdNumTZ          = "-0700"  // always numeric
    stdNumShortTZ     = "-07"    // always numeric
    stdNumColonTZ     = "-07:00" // always numeric
)

因此,无论何时您的格式指定年份,都应使用“06”或“2006”完成,秒由“05”或“5”指定,时区指定为“MST”、“Z0700”、“Z07:00” “、”-0700”、”-07” 或 “-07:00”。如果您引用常量列表,您可能会把您需要解析的任何标准格式放在一起。

例如,如果您想要解析 通用日志格式(Apache 用于其日志文件的格式)中的日期/时间,您可以通过将以下字符串作为 布局 参数传递给 time.Parse() 来实现。

 "02/Jan/2006:15:04:05 -0700"

“02”表示月份中的日期字段,“Jan”表示月份名称字段,“2006”表示年份字段,“15”表示 24 小时格式的小时字段,“04”表示分钟字段, “05”表示秒字段,“-0700”表示时区字段。

该格式将解析当前 PST 时间: 31/Dec/2012:15:32:25 -0800

所以 time.Parse() 调用看起来像这样:

 test, err := time.Parse("02/Jan/2006:15:04:05 -0700", "31/Dec/2012:15:32:25 -0800")

原文由 Daniel 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您不记得指定布局中的数字(“2006-01-02T15:04:05.000Z”),您可以使用我的简单日期格式库 github.com/metakeule/fmtdate ,它使用 MS Excel 约定,例如 Y ,M,D,h 并在内部将它们转换为数字格式:

 package main

import (
    "github.com/metakeule/fmtdate"

    "fmt"
)

func main() {
    test, err := fmtdate.Parse("MM/DD/YYYY", "10/15/1983")
    if err != nil {
        panic(err)
    }

    fmt.Println(test)
}

原文由 metakeule 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题