来自time.Time的意外输出

Isa*_*aac 3 go

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

import (
  "fmt" 
  "time"
)

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

  fmt.Println(t) 
}
Run Code Online (Sandbox Code Playgroud)

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

2018-07-04 12:03:07.2911671 +0800 +08 m=+0.002000201
Run Code Online (Sandbox Code Playgroud)

我原本只希望在+0800后面加上a timeZone,那应该是结尾。预期的输出如下所示,也如本教程视频中所示。但是对我来说,结果的形式要长得多。

2018-07-04 12:03:07.2911671 +0530 IST
Run Code Online (Sandbox Code Playgroud)

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

Fli*_*mzy 5

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

因为该教程是在Go 1.9发行之前创建的。从1.9版开始,单调时钟支持已添加到time.Time结构中,从而增加了这些额外的字段。

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


pet*_*rSO 5

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

Go 1.9 发行说明(2017 年 8 月)

透明单调时间支持

时间包现在透明地跟踪每个时间值中的单调时间,使两个时间值之间的计算持续时间在挂钟调整的情况下成为安全操作。有关详细信息,请参阅包文档和设计文档。

与往常一样,库有各种小的更改和更新,考虑到 Go 1 对兼容性的承诺。

时间

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


打包时间

import "time"

time.Now 返回的 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)
}
Run Code Online (Sandbox Code Playgroud)

游乐场: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
Run Code Online (Sandbox Code Playgroud)