我只是通过观看有关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
格式?
答案 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的单调时钟读数 十进制秒数。
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()时,可以看到该差异。