gpt4 book ai didi

go - UTC()调用是否在rand.Seed(time.Now()。UTC()。UnixNano())中冗余?

转载 作者:行者123 更新时间:2023-12-01 21:15:29 33 4
gpt4 key购买 nike

互联网上的许多示例都使用rand.Seed(time.Now().UTC().UnixNano())初始化伪随机数生成器种子。
我看到,如果省略UTC()调用,它仍然可以正常工作。
Unix(或UnixNano)时间始终是自该纪元以来的秒数(或毫秒),即1970-01-01 00:00:00.000000000 UTC。 Unix或UnixNano时间始终与时区无关。
例如,使用以下代码:

package main

import (
"fmt"
"time"
)

func main() {
t := time.Now()
fmt.Println(t.UnixNano())
fmt.Println(t.UTC().UnixNano())
}
所以我的问题是: UTC()调用是否有任何目的,或者省略 UTC()调用而只调用 rand.Seed(time.Now().UnixNano())可以安全吗?

最佳答案

可以肯定地说,您可以在使用UTC()时省略UnixNano()首先在time.go:1107中查看UTC()的代码:

// UTC returns t with the location set to UTC.
func (t Time) UTC() Time {
t.setLoc(&utcLoc)
return t
}
它仅设置当前时间的位置。
现在,根据time.go文件中 In()方法的注释,位置信息仅用于“显示目的”。参见time.go:1119:
// In returns a copy of t representing the same time instant, but
// with the copy's location information set to loc for display
// purposes.
//
// In panics if loc is nil.
func (t Time) In(loc *Location) Time {
if loc == nil {
panic("time: missing Location in call to Time.In")
}
t.setLoc(loc)
return t
}
仅当必须显示时间时才使用位置:
// abs returns the time t as an absolute time, adjusted by the zone offset.
// It is called when computing a presentation property like Month or Hour.
func (t Time) abs() uint64 {
l := t.loc
// Avoid function calls when possible.
if l == nil || l == &localLoc {
l = l.get()
}
sec := t.unixSec()
if l != &utcLoc {
if l.cacheZone != nil && l.cacheStart <= sec && sec < l.cacheEnd {
sec += int64(l.cacheZone.offset)
} else {
_, offset, _, _ := l.lookup(sec)
sec += int64(offset)
}
}
return uint64(sec + (unixToInternal + internalToAbsolute))
}
运行以下代码以查看区别。两者都基于相同的UnixNano,只改变了小时,因为位置仅在打印之前应用:
var now = time.Now()
var utc = now.UTC()
fmt.Printf("now UnixNano: %d, Hour: %d, Minute: %d, Second: %d\n", now.UnixNano(), now.Hour(), now.Minute(), now.Second())
fmt.Printf("utc UnixNano: %d, Hour: %d, Minute: %d, Second: %d\n", utc.UnixNano(), utc.Hour(), utc.Minute(), utc.Second())

now UnixNano: 1595836999431598000, Hour: 10, Minute: 3, Second: 19
utc UnixNano: 1595836999431598000, Hour: 8, Minute: 3, Second: 19

关于go - UTC()调用是否在rand.Seed(time.Now()。UTC()。UnixNano())中冗余?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63040829/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com