golang时间处理

时间处理是每一门语言的必备技能。关于时间处理其实有两部分,一个是日期相关的,一个是时间间隔相关。首先我们看下如何获取时间间隔,因为对于一个号称高性能的语言来说,对每一个 feature 的执行时间进行统计分析是非常重要的。

统计时间间隔demo

  1. package main
  2.  
  3. import (
  4.         "fmt"
  5.         "time"
  6. )
  7.  
  8. func main() {
  9.         var tp0 time.Time = time.Now() // time point 0,  tp0 := time.Now()
  10.         do_sth()
  11.         var tp1 time.Time = time.Now()            // time point 1,  tp1 := time.Now()
  12.         var duration time.Duration = tp1.Sub(tp0) // time duration,  duration := tp1.Sub(tp0)
  13.         fmt.Println(duration)
  14. }
  15.  
  16. func do_sth() {
  17.         var n uint64 = 5
  18.         time.Sleep(time.Duration(n) * time.Second) // time.Sleep(5 * time.Second)
  19. }

其实很简单,通过 time.Now() 获取两个时间点 time.Time, 然后做一个差就好了。这里的时间精确到 ns ,可以说 very good !

Time和string之间的转化

日常少不鸟的需求,就是给一个日期字符串转换为日期,或是给一个日期转换格式化为某个形式。go 使用 time.Parse(format, s) 来解析字符串成日期, 使用 d.Format(format) 来格式化 d 的字符串展示。可以看下面 demo:

  1. package main
  2. import (
  3.         "fmt"
  4.         "time"
  5. )
  6.  
  7. func main() {
  8.         now := time.Now() // 获取当前时间(日期)
  9.         fmt.Println(now.Format("2006-01-02 15:04:05"))
  10.  
  11.         t := time.Unix(1459517638, 0)
  12.         fmt.Println(t)
  13.         fmt.Println(t.Format("2006-01-02 15:04:05")) // 日期字符串格式化
  14.  
  15.         t2, err := time.Parse("2006-01-02 15:04:05", "2016-04-06 07:30:00") //  日期字符串解析
  16.         if err == nil {
  17.                 fmt.Println(t2)
  18.         }
  19. }

go的一个奇葩的地方是,格式字符串不是 yyyy-MM-dd HH:mm:ss 之类的,而是 2006-01-02 15:04:05 。其中时间必须是: 2006年01月02号15点(下午03点)04分05秒。不是这个时间的格式化串 Parse/Format 日期是不正确的。

golang日期的format格式不是很友好,大家喜闻乐见的 yyyyMMddHHmmss 竟然不支持。怎么办?只能自己造一个喽~

轮子在github上,下面只是给出使用的demo:

  1. package main
  2.  
  3. import (
  4.         "fmt"
  5.         "github.com/antark/time_ext"
  6.         "time"
  7. )
  8.  
  9. func main() {
  10.         now := time.Now() // 获取当前时间(日期)
  11.         fmt.Println(now.Format("今天是:2006年01月02日 具体时间: 15:04:05")) // go 标准格式化
  12.         fmt.Println(time_ext.TimeWrapper{now}.Format("今天是:yyyy年MM月dd日 具体时间: HH:mm:ss")) // time_ext 工具格式化
  13.  
  14.         t2, err := time.Parse("2006-01-02 15:04:05", "2016-12-06 07:30:00") //  go标准解析
  15.         if err == nil {
  16.                 fmt.Println(t2) // 2016-12-06 07:30:00 +0000 UTC
  17.         }
  18.  
  19.         t3, err := time_ext.Parse("yyyy-MM-dd HH:mm:ss", "2016-12-06 07:30:00") // time_ext 工具解析
  20.         if err == nil {
  21.                 fmt.Println(t3, t2 == t3) // 2016-12-06 07:30:00 +0000 UTC true
  22.         }
  23. }

Tags: 

Article type: