来自time.Time的意外输出

时间:2018-07-04 04:07:52

标签: go

我只是通过观看有关Udemy的教学视频开始学习Go的,我尝试按如下方式打印当前时间

import (
  "fmt" 
  "time"
)

func main(){
  t := time.Now()

  fmt.Println(t) 
}

我得到一个很长的文本作为如下输出

2018-07-04 12:03:07.2911671 +0800 +08 m=+0.002000201

我期望只得到+0800,然后是timeZone,这应该是结尾。预期的输出如下所示,也如本教程视频中所示。但是对我来说,结果的形式要长得多。

2018-07-04 12:03:07.2911671 +0530 IST

问题是,为什么相同的命令date.Now()在教师的程序和我的程序之间返回不同的格式?为什么没有设置任何特定格式,不应该返回standardize/base格式?

3 个答案:

答案 0 :(得分:4)

  

问题是,为什么相同的命令date.Now()在教师的程序和我的程序之间返回不同的格式?

因为该教程是在Go 1.9发行之前创建的。从1.9版开始,monotonic clock support被添加到time.Time结构中,从而增加了这些额外的字段。

对于正常使用,您应该始终使用Format函数输出时间,而不是输出原始数据。这样将产生更有用的输出,并防止将来在基础类型上添加任何内容。

答案 1 :(得分:2)

您的Udemy教程视频已过时。 Go会不断更新。例如,一个单调的时钟错误修复程序:

  

Go 1.9 Release Notes (August 2017)

     

Transparent Monotonic Time support

     

时间包现在可以透明地跟踪每个时间中的单调时间   值,使两个时间值之间的持续时间安全   在调整挂钟的情况下进行操作。查看包装   文档和设计文档以获取详细信息。

     

与往常一样,对该库进行了各种较小的更改和更新,   遵循Go 1的兼容性承诺。

     

时间

     

如果“时间”值具有单调时钟读数,则其字符串   表示形式(由String返回)现在包含一个final字段   “ m =±value”,其中value是格式为a的单调时钟读数   十进制秒数。


  

Package time

     

import "time"

     

按时间返回的时间。现在包含单调时钟读数。如果   时间t具有单调的时钟读数t.Add将相同的持续时间添加到   挂钟和单调时钟读数均可计算   结果。因为t.AddDate(y,m,d),t.Round(d)和t.Truncate(d)是   墙上的时间计算,他们总是剥离任何单调的时钟读数   从他们的结果。因为t.In,t.Local和t.UTC用于   他们对墙上时间的解释的影响,他们也剥离   从结果中读取的任何单调时钟。规范的方法   去除单调时钟读数将使用t = t.Round(0)。


fmt.Println(t)使用调试格式,因此将打印所有基础time.Time字段。

  

剥离单调时钟读数的典型方法是使用t =   t.Round(0)。

例如,

package main

import (
    "fmt"
    "time"
)

func main() {
    t := time.Now()
    fmt.Println(t)
    fmt.Println(t.Round(0))

    t2 := time.Now().Round(0)
    fmt.Println(t2)
}

游乐场:https://play.golang.org/p/p_pjRWRB8_y

输出:

2009-11-10 23:00:00 +0000 UTC m=+0.000000001
2009-11-10 23:00:00 +0000 UTC
2009-11-10 23:00:00 +0000 UTC

答案 2 :(得分:1)

+08是t.Location().String()返回的字符串。在创建时会给位置一个字符串,用于标识它。可以是IST,也可以是“ +08”或您可以想到的任何其他字符串。

m = + 0.002000201是单调时钟。它用于更精确的持续时间。有关Go的单调时钟实现的更多信息,请参见https://golang.org/pkg/time/#hdr-Monotonic_Clocks

由于单调时钟出现在t.String()中的原因:

  

对于调试,t.String的结果确实包括单调时钟读数(如果存在)。如果由于不同的单调时钟读数而导致t!= u,则在打印t.String()和u.String()时,可以看到该差异。