Go “的目的是什么?”;方便时间邮票;在时间包里?

Go “的目的是什么?”;方便时间邮票;在时间包里?,go,Go,参考: 我试图弄清楚时间包中的“方便时间戳”是用来做什么的 我可以使用其他常量(如RFC)解析日期 t, _ := time.Parse(time.RFC822, "02 Jan 06 15:04 MST") fmt.Println(t.Unix()) vs 最后的输出是错误的。我错过了什么?这些时间戳如何有用 以下是时间常数的Godoc: const ( ANSIC = "Mon Jan _2 15:04:05 2006" UnixDate

参考:

我试图弄清楚时间包中的“方便时间戳”是用来做什么的

我可以使用其他常量(如RFC)解析日期

t, _ := time.Parse(time.RFC822, "02 Jan 06 15:04 MST")
fmt.Println(t.Unix())
vs

最后的输出是错误的。我错过了什么?这些时间戳如何有用

以下是时间常数的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"
)
最后的输出是错误的。我错过了什么?这些时间戳如何有用

您肯定错过了一个错误检查,让我们添加它

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

<nil>
0000-01-02 15:04:05 +0000 UTC
解析时间“Jan\u 2 15:04:05”为“Jan\u 2 15:04:05”:无法解析“\u 2” 15:04:05“as”\u 2 -62135596800

正确的字符串应该是“Jan2 15:04:05”(注意Jan和2之间的双空格)。关于文档中的下划线:

在格式字符串中,下划线u表示一个可能 如果以下数字(一天)有两位数,则替换为一位数; 与固定宽度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-01-02 15:04:05+0000 UTC
所以它是负数,因为年份是0000

最后,它在哪里有用?例如,测量耗时操作的持续时间。您可以将当前时间以一种戳记格式输出到日志,并显示一些消息,如“开始执行此操作”、“完成执行此操作”。然后,因为它是固定宽度格式,并且没有不必要的年份信息,所以很容易读取日志,很容易解析这些日志

这种格式实际上在*nix中的“syslog”中使用

最后的输出是错误的。我错过了什么?这些时间戳如何有用

您肯定错过了一个错误检查,让我们添加它

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

<nil>
0000-01-02 15:04:05 +0000 UTC
解析时间“Jan\u 2 15:04:05”为“Jan\u 2 15:04:05”:无法解析“\u 2” 15:04:05“as”\u 2 -62135596800

正确的字符串应该是“Jan2 15:04:05”(注意Jan和2之间的双空格)。关于文档中的下划线:

在格式字符串中,下划线u表示一个可能 如果以下数字(一天)有两位数,则替换为一位数; 与固定宽度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-01-02 15:04:05+0000 UTC
所以它是负数,因为年份是0000

最后,它在哪里有用?例如,测量耗时操作的持续时间。您可以将当前时间以一种戳记格式输出到日志,并显示一些消息,如“开始执行此操作”、“完成执行此操作”。然后,因为它是固定宽度格式,并且没有不必要的年份信息,所以很容易读取日志,很容易解析这些日志


这种格式实际上在*nix中的“syslog”中使用。

这两个日期不同;您传递给RFC822的是2006年的MST。
Stamp
one没有指定年份或时区,因此它可能会选择今年和您的时区。@nmichaels如果是今年和我的时区,那么输出不是正数吗?如果我知道问题的答案,我会回答它。我不知道为什么它是负面的,但不管它有什么问题,这些日期是不一样的;您传递给RFC822的是2006年的MST。
Stamp
one没有指定年份或时区,因此它可能会选择今年和您的时区。@nmichaels如果是今年和我的时区,那么输出不是正数吗?如果我知道问题的答案,我会回答它。我不知道为什么它是负面的,但不管它有什么问题,这些日期都不一样。下面是一个游乐场示例: