时间意外输出。时间:包含"m=+"字符串



我刚刚开始学习围棋,按照 Udemy 上的教程视频,我尝试打印当前时间如下

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格式吗?

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

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

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

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

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

透明单调时间支持

时间包现在可以透明地跟踪每个时间中的单调时间 值,使两个时间值之间的计算持续时间变得安全 在存在挂钟调整的情况下操作。查看套餐 有关详细信息的文档和设计文档。

与往常一样,库有各种小的更改和更新, 在考虑 Go 1 兼容性承诺的情况下制作。

时间

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


打包时间

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 = 四舍五入(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

> +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(( 和 you.String(( 时可以看到这种差异。

最新更新