时间包中“Handy time stamps”的目的是什么?

时间:2014-01-30 18:51:50

标签: go

参考:

我想弄清楚时间包中使用的“Handy Time Stamp”是什么。

我可以使用其他常量(如RFC

)解析日期
t, _ := time.Parse(time.RFC822, "02 Jan 06 15:04 MST")
fmt.Println(t.Unix())
Output 1136214240

vs

t, _ := time.Parse(time.Stamp, "Jan _2 15:04:05")
fmt.Println(t.Unix())
Output: -62135596800

最后一个输出是错误的。我在这里错过了什么?这些时间戳有用吗?

下面是时间常数的Godoc:

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

1 个答案:

答案 0 :(得分:6)

  

最后一个输出是错误的。我在这里错过了什么?这些时间戳有用吗?

你肯定错过了这里的错误检查,让我们添加它

t, err := time.Parse(time.Stamp, "Jan _2 15:04:05")
fmt.Println(err)
fmt.Println(t.Unix())

输出:

  

解析时间“Jan _2 15:04:05”为“Jan _2 15:04:05”:无法解析“_2   15:04:05“as”_2“   -62135596800

正确的字符串将是“1月2日15:04:05”(注意1月和2月之间的双倍空格)。关于文档的下划线:

  

在格式字符串中,下划线_表示可能的空格   如果以下数字(一天)有两位数,则用数字代替;   与固定宽度的Unix时间格式兼容。

然后,为什么它作为UNIX时间的表示是否定的,让我们检查一下:

t, err := time.Parse(time.Stamp, "Jan  2 15:04:05")
fmt.Println(err)
fmt.Println(t)

输出:

<nil>
0000-01-02 15:04:05 +0000 UTC

所以它是负面的,因为年份是0000。

最后,它有用吗?例如,要测量耗时操作的持续时间。您可以输出以Stamp格式之一记录当前时间以及一些消息,例如“开始执行此操作”,“完成此操作”。然后,因为它是固定宽度格式并且没有不必要的年份信息 - 它很容易阅读日志,很容易解析这些日志。

此格式实际上用于* nix中的“syslog”。