时间处理是很复杂的。关于时间的错误的假设通常包括以下几个方面:
一天有 24 小时一小时有 60 分钟一周有七天一年 365 天还有更多例如,1表示在一个时间点上加上24小时,并不总能产生一个新的日历日期。
因此, 在处理时间时,始终使用 "time"
包,因为它有助于以更安全、更精确的方式处理这些错误的假设。
使用time.Time表达瞬时时间
处理瞬时时间时请使用time.Time
,在比较、添加和减少时间时使用time.Time
中的方法。
Bad
func isActive(Now, start, stop int) bool { return start <= Now && Now < stop //使用了int 比较}
Good
func isActive(Now, start, stop time.Time) bool { //使用time.Time中的方法 return (start.Before(Now) || start.Equal(Now)) && Now.Before(stop)}
使用 time.Duration
处理间隔时间
在处理间隔时间(时间段)时使用 time.Duration
.
Bad
func poll(delay int) { for { // ... time.Sleep(time.Duration(delay) * time.Millisecond) }}poll(10) // 参数代表的是几秒钟还是几毫秒?
Good
//代表了时间段func poll(delay time.Duration) { for { // ... time.Sleep(delay) }}poll(10*time.Second) //可以看出是10秒钟
回到前面的例子,给一个时间点瞬时加上24小时,我们用于添加时间的方法取决于要达到的目的:如果我们想要下一个日历日(当前天的下一天)的同一个时间点,我们应该使用Time.AddDate
.方法。如果我们想保证某一时刻比前一时刻晚 24 小时,我们应该使用 Time.Add。
newDay := t.AddDate(0 /* years */, 0 /* months */, 1 /* days */)maybeNewDay := t.Add(24 * time.Hour)
对外部系统使用time.Time和time.Duration
尽可能在与外部系统的交互中,使用 time.Duration
和 time.Time
. 例如 :
flag
通过 time.ParseDuration
支持 time.Duration
JsON: encoding/json
通过其 UnmarshalJSON
method 方法支持将 time.Time
编码为 RFC 3339 字符串sql: database/sql
支持将 DATETIME
或 TIMESTAMP
列转换为 time.Time
,如果底层驱动程序支持则返回YAML: gopkg.in/yaml.v2
支持将 time.Time
作为 RFC 3339 字符串,并通过 time.ParseDuration
支持当不能在这些交互中使用time.Duration,请使用 int
或 float64,并且要在字段名称中包含时间单位。
例如
enCoding/Json不支持time.Duration,时间单位则包含在了字段名称中。
Bad
// {"interval": 2}type Config struct { Interval int `Json:"interval"` //没有表明时间单位}
Good
// {"intervalMillis": 2000}type Config struct { IntervalMillis int `Json:"intervalMillis"`}
如果当在这些交互中不能使用 time.Time
时,除非替代方法达成一致了,否则使用 string
和 RFC 3339 中定义的格式时间戳。默认情况下,Time.UnmarshalText
使用此格式,并可通过 time.RFC3339
在 Time.Format
和 time.Parse
中使用。
尽管这在实践中并不成问题,但请记住,"time"
包不支持解析闰秒时间戳(8728),也不在计算中考虑闰秒(15190)。如果您比较两个时间瞬间,则差异将不包括这两个瞬间之间可能发生的闰秒。
以上是内存溢出为你收集整理的Uber Go 语言编程规范:使用time处理时间全部内容,希望文章能够帮你解决Uber Go 语言编程规范:使用time处理时间所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)