回答

收藏

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

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

如何在 Go 分析非标准日期/时间字符串。例如,如果我想将字符串10/15/1983转换为time.Time? 该time.Parse()函数应允许您指定格式。
, G0 ?' C! A& z$ e. ?: ^' Ihttp://play.golang.org/p/v5DbowXt1x- y  ^$ {) `- o9 @- m* h. Q
    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)}
    8 \! S& j. x3 `% Q4 ?9 E( a
这导致恐慌。6 B, j7 f" v( u2 T
panic: parsing time "10/15/1983" as "10/15/1983": cannot parse "" as "0/"从逻辑上讲,这是合理的,因为它应该如何知道哪一天是哪个月。1 K, G+ v' A& r) K1 H  C
其它语言具有以下功能:
; ?4 K7 m2 n! \7 v' w4 pparse("mm/dd/yyyy","10/15/1983")我在 Go 文档中找不到这样的函数是我唯一的正则表达选择吗?
* X: q. C* H! k) i: T+ {                                                               
' ~6 ^! @# r; O+ i5 m% G8 t    解决方案:                                                                  g9 Q& s/ T3 |( M& c! v( j
                                                                time.Parse 正在寻找一些关键值。
0 ]3 {* W( ^* z% O+ G' Y通过改变:* B% m( g/ J" F, R' F1 e3 s0 U! u
    test,err := time.Parse("10/15/1983","10/15/1983")/ w  l2 @  z% \8 R6 w, L

  d2 b# i) G3 I% o
    test,err := time.Parse("01/02/2006","10/15/1983")
    3 G1 Q3 m4 J. O1 ?, k
分析器会识别它。2 m5 G# y& v0 Q8 ]2 `* g
这是操场上修改的代码。
9 Z; b- C" p# T( ]
    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)}
    : Q$ a! {. M* _+ `9 W3 C( K# {) R
您可以利用src/pkg/time/format.go创建自己的分析格式是文件中的常量列表。9 H1 V( N2 j7 r* h; a+ b( l
    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)
    6 ]& z+ h- N: e+ y. [: A& K- u
因此,无论何时您的格式指定年份,都应使用06或2006完成,秒由05或5指定,时区指定为MST”、“Z0700”、“Z07:00” “、”-0700”、”-07” 或 “-07:00”。若引用常量列表,则可将需要分析的任何标准格式放在一起。
6 R$ f$ U0 T) h8 _% L! s2 j例如,如果你想分析Common Log Format 中间的日期/时间,即 Apache 用于其日志文件的格式,您可以串以下字符time.Parse()作为布局实现参数传递。+ N# n1 ]/ b9 t4 G
    "02/Jan/2006:15:04:05 -0700"
    " a; A0 i  ~2 X
02表示月字段,Jan表示月名字段,2006表示年字段,15表示24小时格式,04表示分钟字段,05表示秒字段-时区字段表示0700。, J& [! e8 K- E; c# @5 P
该格式将分析当前 PST 时间: 31/ Dec/2012:15:32:25 -0800
3 {5 B4 V5 n3 P6 x. \# M所以time.Parse()调用看起来像这样:/ x0 e- ^5 {5 d3 Z  O
    test,err := time.Parse("02/Jan/2006:15:04:05 -0700","31/Dec/2012:15:32:25 -0800")( [, [3 Q9 S5 d3 a2 k2 X
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则