回答

收藏

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

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

如何在 Go 分析非标准日期/时间字符串。例如,如果我想将字符串10/15/1983转换为time.Time? 该time.Parse()函数应允许您指定格式。( ]1 r# t9 ?# x. c
http://play.golang.org/p/v5DbowXt1x( k; o7 g8 J; y" @1 S
    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)}
    ! B( m" A. l5 V+ p4 }# F
这导致恐慌。2 i: N9 R' A1 y% T  x
panic: parsing time "10/15/1983" as "10/15/1983": cannot parse "" as "0/"从逻辑上讲,这是合理的,因为它应该如何知道哪一天是哪个月。( p3 q! q+ u1 Q% b3 X1 y! @
其它语言具有以下功能:
# i- ]! `" X7 Z1 X% c: z) fparse("mm/dd/yyyy","10/15/1983")我在 Go 文档中找不到这样的函数是我唯一的正则表达选择吗?
) {# Y, s5 M; Z0 c                                                               
: _  F' b0 F8 O( W4 I    解决方案:                                                               
: A7 l/ E! n/ C! w                                                                time.Parse 正在寻找一些关键值。
! r# y( {) m: D! p2 V通过改变:
/ Y$ ]2 t" S4 }( D+ s
    test,err := time.Parse("10/15/1983","10/15/1983")- h( d$ t" K% z" i7 Y9 J
3 Z# \6 W1 k/ V
    test,err := time.Parse("01/02/2006","10/15/1983")/ K- h, A* C( P' `# O
分析器会识别它。
6 S" a8 v! x: w& G, Y" U: V这是操场上修改的代码。
: L1 R* G4 @) I
    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)}: k: l6 ^$ [7 Z$ ?5 H0 @* b/ O
您可以利用src/pkg/time/format.go创建自己的分析格式是文件中的常量列表。  n! h6 T+ D1 [# k$ n
    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)4 @: a( X. j! G( b2 P
因此,无论何时您的格式指定年份,都应使用06或2006完成,秒由05或5指定,时区指定为MST”、“Z0700”、“Z07:00” “、”-0700”、”-07” 或 “-07:00”。若引用常量列表,则可将需要分析的任何标准格式放在一起。
: p/ E6 ?0 D& {7 b' f; o例如,如果你想分析Common Log Format 中间的日期/时间,即 Apache 用于其日志文件的格式,您可以串以下字符time.Parse()作为布局实现参数传递。
0 d# \: S' n5 k% S
    "02/Jan/2006:15:04:05 -0700"/ ]" Q* r* O* A% U
02表示月字段,Jan表示月名字段,2006表示年字段,15表示24小时格式,04表示分钟字段,05表示秒字段-时区字段表示0700。, q/ G3 ?3 Q2 O" t9 s$ `
该格式将分析当前 PST 时间: 31/ Dec/2012:15:32:25 -0800; B5 ^- V7 Y& r; i. A* G
所以time.Parse()调用看起来像这样:
- x" w$ x: L& ]7 ~% p* M
    test,err := time.Parse("02/Jan/2006:15:04:05 -0700","31/Dec/2012:15:32:25 -0800")6 o* {6 Z! f# k) O
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则