使用Go解析Go时间戳

10

Go 打印时间

time.Now().String()

2012-12-18 06:09:18.6155554 +0200 FLEST
2009-11-10 23:00:00 +0000 UTC

http://play.golang.org/p/8qwq9U_Ri5

我该如何解析它?

我猜想FLEST是指芬兰-拉脱维亚-爱沙尼亚标准时间,但我不在这些国家,也可能会遇到各种时区。我找不到一种统一的方式或模式来使用time.Parse进行解析。


我认为这是Go语言中的一个错误。Go语言包含一个名为lib/time/zoneinfo.zip的文件,其中“包含”了许多时区,但没有FLEST时区。但是我不明白为什么首先会打印出FLEST。 - topskip
我的Windows 7电脑在日志文件中打印了FLEST时区,但同一台电脑无法解析该时区? - Max
3个回答

12

尽管time.Parse()接受格式字符串(如2006-01-02 15:04:05 -0700 MST),但使用time中定义的constants之一可能更简单。

const (
    ANSIC       = "Mon Jan _2 15:04:05 2006"
    UnixDate    = "Mon Jan _2 15:04:05 MST 2006"
    RubyDate    = "Mon Jan 02 15:04:05 -0700 2006"
    RFC822      = "02 Jan 06 15:04 MST"
    RFC822Z     = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
    RFC850      = "Monday, 02-Jan-06 15:04:05 MST"
    RFC1123     = "Mon, 02 Jan 2006 15:04:05 MST"
    RFC1123Z    = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
    RFC3339     = "2006-01-02T15:04:05Z07:00"
    RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
    Kitchen     = "3:04PM"
    // Handy time stamps.
    Stamp      = "Jan _2 15:04:05"
    StampMilli = "Jan _2 15:04:05.000"
    StampMicro = "Jan _2 15:04:05.000000"
    StampNano  = "Jan _2 15:04:05.000000000"
)

如果您正在使用字符串作为存储或编码时间的方式(例如使用限制性编码格式),您可能希望考虑使用Unix time。这样,您可以只存储一个int64(或两个,如果保留纳秒数)。

无法从"2012-12-18 06:09:18.6155554 +0200 FLEST"进行解析 - 解析出错,无法将时间“2012-12-18 06:09:18.6155554 +0200 FLEST”解析为“2006-01-02 15:04:05 -0700 MST”:“无法将“FLEST”解析为“MST””。 - Max

10

5
time.String的文档给出了它使用的格式:"2006-01-02 15:04:05.999999999 -0700 MST"。首先,您可以使用相同的格式进行解析。
时区可能是一个问题。如果您必须解析您知道是在其他时区生成的time.String时间,您必须拥有该时区的zoneinfo。请参阅LoadLocation下的文档。如果您无法获取zoneinfo,无法在系统上安装它,或者不能冒险在某个新的未知时区上失败,则time.String格式不适合您。您将需要以不同的格式获取时间戳,或从字符串中删除时区并使用修改后的格式解析修改后的字符串。

原来1.0.3版本中存在一个错误,现在已经在tip中修复了,这个错误导致了.999格式无法正常工作。你遇到的FLEST问题是另外一个问题。我建议你按照我提到的方法从字符串末尾删除时区信息。如果发生错误,我会通过在错误消息中搜索区域名称"FLEST",如果找到,则重新解析并从字符串和格式中删除区域名称来处理该错误。 - Sonia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接