Time 正在分析不是';标准&x27;格式

Time 正在分析不是';标准&x27;格式,time,go,Time,Go,如何解析Go中的非标准日期/时间字符串。例如,如果我想将字符串10/15/1983转换为time.time?time.Parse()函数应该允许您指定格式 这导致了恐慌 panic:将时间“10/15/1983”解析为“10/15/1983”:无法将“”解析为“0/” 从逻辑上讲,这是有道理的,因为它应该如何知道哪一天和哪一个月 其他语言具有与以下类似的功能: parse(“mm/dd/yyyy”,“10/15/1983”) 我在Go文档中找不到这样的函数,这是我唯一的regex选择吗?tim

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

这导致了恐慌

panic:将时间“10/15/1983”解析为“10/15/1983”:无法将“”解析为“0/”

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

其他语言具有与以下类似的功能:

parse(“mm/dd/yyyy”,“10/15/1983”)


我在Go文档中找不到这样的函数,这是我唯一的regex选择吗?

time.Parse正在寻找一些键值

通过改变:

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

解析器将识别它

这是我的建议


您可以利用文件中的常量列表创建自己的解析格式

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

如果您记不起指定布局(“2006-01-02T15:04:05.000Z”)中的数字,可以使用我的简单日期格式库,该库使用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)
}

如果您正在寻找一个C风格的格式化函数:在查看了我选择的一些选项之后,因为它通常遵循strfmt(3)表示法

举个例子:

import (
    "fmt"
    "time"
    "github.com/cactus/gostrftime"
)

func main() {
    now := time.Now()
    fmt.Println(gostrftime.Format("%Y-%m-%d", now))
}

如果C和Go都必须使用日期格式,并且不涉及C实现,那么就别无选择,只能在Go端进行调整。上述软件包满足了这一需求。

如果您不想费心记住这些神奇的数字,您可以这样做:

package main

import (
   "fmt"
   "time"
)

func main() {
   var (
      y, d int
      m time.Month
   )
   fmt.Sscanf("10/15/1983", "%v/%v/%v", &m, &d, &y)
   t := time.Date(y, m, d, 0, 0, 0, 0, time.UTC)
   fmt.Println(t) // 1983-10-15 00:00:00 +0000 UTC
}

您可能想看看Paul Smith,您的代码是否有效,但为什么?如果我将其更改为
time.Parse(“01/02/2005”、“10/15/1983”)
它将失败。。。与2005年、2004年、1990年等相比,2006年的神奇之处是什么?在重新阅读这些文件后,我认为这一点可以在其中更清楚地表达出来。我举了几个真实世界的例子来说明这一点。在我徒劳的尝试中,我尝试了诸如
time.Parse(“stdLongMonth/stdLongDay/stdLongYear”,“10/15/83”)
=p.Wow,Go文档可能会提到你在日期格式中使用的数字实际上很重要。嗨,Nuncleon。你犯了两个错误。首先,您为您的格式选择了错误的常量:应该是stdzeromount/stdZeroDay/stdYear,其次,您需要使用此常量的值。因此,对于您的案例,您需要这样解析:
time.parse(“01/02/06”、“10/15/83”)
这是一种多么狡猾的方法!谢谢你的解释+1对于记不住的人,1,2,3,4,5,6,7(01/02 03:04:05 PM'06-07)??至少strftime格式字符串支持更多内容,您的电子表格格式甚至没有12小时的am/pm支持,因此在几个方面是一种倒退。@DaveC我们德国人不认为am/pm格式,所以15到3是一种思维转变,您还必须记住顺序:天、月、小时/下午、分钟、秒、年、时区。今年的情况很奇怪。然而,我总是要查找它,我不是唯一一个。。。。另外,对于不熟悉go time格式的人来说,excel格式显然是一种格式,不能与真实日期混淆。@DaveC我已经更新了库以支持时区和AM/PM。少了什么?
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)
}
import (
    "fmt"
    "time"
    "github.com/cactus/gostrftime"
)

func main() {
    now := time.Now()
    fmt.Println(gostrftime.Format("%Y-%m-%d", now))
}
package main

import (
   "fmt"
   "time"
)

func main() {
   var (
      y, d int
      m time.Month
   )
   fmt.Sscanf("10/15/1983", "%v/%v/%v", &m, &d, &y)
   t := time.Date(y, m, d, 0, 0, 0, 0, time.UTC)
   fmt.Println(t) // 1983-10-15 00:00:00 +0000 UTC
}