ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Uber Go 语言编程规范:使用time处理时间

2021-03-07 17:33:33  阅读:289  来源: 互联网

标签:Uber 24 使用 Duration 时间 time Time Go


时间处理是很复杂的。关于时间的错误的假设通常包括以下几个方面:

  1. 一天有 24 小时
  2. 一小时有 60 分钟
  3. 一周有七天
  4. 一年 365 天
  5. 还有更多

例如,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 . 例如 :

当不能在这些交互中使用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,24,使用,Duration,时间,time,Time,Go
来源: https://blog.csdn.net/hero_java/article/details/114488534

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有