回答

收藏

如何在 Go 中解析非标准日期/时间字符串

技术问答 技术问答 305 人阅读 | 0 人回复 | 2023-09-12

如何在 Go 分析非标准日期/时间字符串。例如,如果我想将字符串10/15/1983转换为time.Time? 该time.Parse()函数应允许您指定格式。! x2 L6 w. L$ n) w$ ?: t/ h
http://play.golang.org/p/v5DbowXt1x' i) B! o& f" L5 H
    package mainimport "fmt"import "time"func main()      test,err := time.Parse("10/15/1983","10/15/1983")    if err != nil              panic(err)   }    fmt.Println(test)}% e8 ~) K1 y/ k6 \. t; T
这导致恐慌。: x3 |; u. C8 I0 {  E( x
panic: parsing time "10/15/1983" as "10/15/1983": cannot parse "" as "0/"从逻辑上讲,这是合理的,因为它应该如何知道哪一天是哪个月。5 K0 e2 M4 H; W- ]0 F+ b
其它语言具有以下功能:& d" h4 A& C) j. f( z: X
parse("mm/dd/yyyy","10/15/1983")我在 Go 文档中找不到这样的函数是我唯一的正则表达选择吗?9 Y8 }6 y6 r' J& I
                                                               
/ A% s0 F  N3 Q- v4 {4 N% Q    解决方案:                                                               
2 V( `+ M5 l0 Z2 [                                                                time.Parse 正在寻找一些关键值。/ s6 w! q, H/ _
通过改变:
* w, y4 o" E0 T4 o8 r) N  Z8 _
    test,err := time.Parse("10/15/1983","10/15/1983")
    8 \( F# I8 y" y: l
4 b6 q3 S/ O9 f1 o/ ~* S
    test,err := time.Parse("01/02/2006","10/15/1983")$ a9 W! e2 K# H8 j$ g- F# L3 I
分析器会识别它。
8 w4 a2 z: a9 a# w6 |* n5 H这是操场上修改的代码。
5 Q) @6 D' k* ^% `* K% m
    package mainimport "fmt"import "time"func main()      test,err := time.Parse("01/02/2006","10/15/1983")    if err != nil              panic(err)   }    fmt.Println(test)}
    / m) D- J: l+ |& L' {
您可以利用src/pkg/time/format.go创建自己的分析格式是文件中的常量列表。! v- O3 J( l- b' w: T6 x: z8 V
    const  stdLongMonth      = "January"    stdMonth          = "Jan"    stdNumMonth       = "1"    stdZeroMonth      = "01"    stdLongWeekDay    = "Monday"    stdWeekDay        = "Mon"    stdDay            = "2"    stdUnderDay       = "_2"    stdZeroDay        = "02"    stdHour           = "15"    stdHour1212                   = "3"    stdZeroHour12     = "03"    stdMinute         = "4"    stdZeroMinute     = "04"    stdSecond         = "5"    stdZeroSecond     = "05"    stdLongYear       = "2006"    stdYear           = "06"    stdPM             = &quotM"    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). Z* t# [3 h0 X( z3 k1 S- k
因此,无论何时您的格式指定年份,都应使用06或2006完成,秒由05或5指定,时区指定为MST”、“Z0700”、“Z07:00” “、”-0700”、”-07” 或 “-07:00”。若引用常量列表,则可将需要分析的任何标准格式放在一起。. v' R+ T  b9 N* j( i! N. Z; a
例如,如果你想分析Common Log Format 中间的日期/时间,即 Apache 用于其日志文件的格式,您可以串以下字符time.Parse()作为布局实现参数传递。
( ^! d2 K+ y  C% P
    "02/Jan/2006:15:04:05 -0700"
    : ~+ `% s$ ]1 D( d
02表示月字段,Jan表示月名字段,2006表示年字段,15表示24小时格式,04表示分钟字段,05表示秒字段-时区字段表示0700。
, U6 i( R! z( E" H+ K该格式将分析当前 PST 时间: 31/ Dec/2012:15:32:25 -0800" O2 T$ }5 ]: v# x" [
所以time.Parse()调用看起来像这样:
  b7 u$ R9 a9 L$ [. ~- E
    test,err := time.Parse("02/Jan/2006:15:04:05 -0700","31/Dec/2012:15:32:25 -0800")
    8 T1 \7 U, y6 W8 Q4 o( K+ d+ h
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则