time 用法大全

本章就來學習時間相關的所有操作

1.延遲d秒后返回通過信道返回時間值

func After(d Duration) <-chan Time

示例

package main

import (
  "time"
  "fmt"
)

func main() {

  date := <- time.After(3*time.Second)
  fmt.Println(date)
}

3 秒后會返回一個chan time 數據,程序繼續向下執行


image.png

2.當前的 goroutine 睡眠至少持續時間d 如果d為0或者負值程序立即執行

func Sleep(d Duration)

package main

import (
  "time"
  "fmt"
)
func main() {
  time.Sleep(1*time.Second)
  fmt.Println("延時1s執行")
}
image.png

3. 不能被關閉的間隔觸發器

func Tick(d Duration) <-chan Time

這個方法可以間隔的像信道填值,但是沒有辦法阻止這個過程

示例

package main

import (
  "time"
  "fmt"
)

func main() {
  c := time.Tick(1 * time.Second)
  for now := range c {
    fmt.Printf("延時執行該做的事情 %s\n", now)
  }
}
image.png

4.計算持續時間

type Duration int64
持續時間表示兩個瞬間之間的經過時間,為int64納秒計數。

package main

import (
  "time"
  "fmt"
)

func main() {
  // 1s 等于 1000ms
  second := time.Second
  fmt.Println(int64(second/time.Millisecond))

  // 10s
  seconds := 10
  fmt.Println(time.Duration(seconds)*time.Second)
}
image.png

5.將字符串解析成功時間格式

func ParseDuration(s string) (Duration, error)
有效時間單位為“ns”,“us”(或“μs”),“ms”,“s”,“m”,“h”

package main

import (
  "time"
  "fmt"
)

func main() {
 d,error:= time.ParseDuration("2h2s")
 fmt.Println(d)
 fmt.Println(error)

  d,error = time.ParseDuration("2h2ns")
  fmt.Println(d)
  fmt.Println(error)
  d,error = time.ParseDuration("2s2ns")
  fmt.Println(d)
  fmt.Println(error)

  d,error = time.ParseDuration("2s2ms")
  fmt.Println(d)
  fmt.Println(error)
}
image.png

6.計算從t到time.now 的時間

func Since(t Time) Duration

package main

import (
"time"
"fmt"
)

func main() {
  // 將時間先轉換成時間戳
  s := time.Now().Local().UnixNano()
  // 已系統起始日期為基準計算偏移后的time
  t := time.Unix(0, s-1000000)
  // 與當前日期進行運算計算時間差
  elapsed := time.Since(t)
  fmt.Println(elapsed)
}
image.png

7.Until 從t計算到now的時間差

func Until(t Time) Duration

package main

import (
"time"
"fmt"
)

func main() {
  // 將時間先轉換成時間戳
  s := time.Now().Local().UnixNano()
  // 已系統起始日期為基準計算偏移后的time
  t := time.Unix(0, s-1000000)
  // 與當前日期進行運算計算時間差
  elapsed := time.Until(t)
  fmt.Println(elapsed)
}
image.png

8.獲取日期的年月日時分秒

func (t Time) Date() (year int, month Month, day int)
func (t Time) Minute() int
func (t Time) Month() Month
func (t Time) Hour() int
func (t Time) Day() int // 當月多少號
func (t Time) Weekday() Weekday
func (t Time) Year() int
func (t Time) YearDay() int
func (t Time) Nanosecond() int
func (t Time) Second() int
package main

import (
"time"
"fmt"
)

func main() {
  // 將時間先轉換成時間戳
  t := time.Now()
  year := t.Year()
  month := t.Month()
  day := t.Day()
  h:= t.Hour()
  m:= t.Minute()
  s := t.Second()
  fmt.Printf("%d-%d-%d %d:%d:%d",year,month,day,h,m,s)
  }
image.png

9.計算總計多少小時,分鐘 等

func (d Duration) Hours() float64
func (d Duration) Minutes() float64
func (d Duration) Nanoseconds() int64
func (d Duration) Seconds() float64
package main

import (
"time"
"fmt"
)

func main() {
  // 將時間先轉換成時間戳
  now:= time.Now()
  t := now.Add(time.Second*3600)
  d := time.Until(t)
  fmt.Printf("共小時:%f\n",d.Hours())
  fmt.Printf("共分鐘:%f\n",d.Minutes())
  fmt.Printf("共秒:%f\n",d.Seconds())
  fmt.Printf("共納秒:%d\n",d.Nanoseconds())
  }
image.png

10. 將四舍五入d的結果值

func (d Duration) Round(m Duration) Duration

該時間點應該滿足從Time零值到該時間點的時間段能整除d;如果有兩個滿足要求的時間點,距離t相同,會向上舍入;如果d <= 0,會返回t的拷貝

通俗的將,就是講時間保留到指定的時間單位上如 t.Round(time.Second) 則最終的格式為 12:15:31

package main

import (
  "time"
  "fmt"
)

func main() {
  t := time.Date(0, 0, 0, 12, 15, 30, 918273645, time.UTC)
  round := []time.Duration{
    time.Nanosecond,
    time.Microsecond,
    time.Millisecond,
    time.Second,
    2 * time.Second,
    time.Minute,
    10 * time.Minute,
    time.Hour,
  }
  for _, d := range round {
    fmt.Printf("t.Round(%6s) = %s\n", d, t.Round(d).Format("15:04:05.999999999"))
  }

  }
image.png

11.但是返回的是最接近但早于t的時間點

func (d Duration) Truncate(m Duration) Duration

package main

import (
  "time"
  "fmt"
)

func main() {
  t, _ := time.Parse("2006 Jan 02 15:04:05", "2012 Dec 07 12:15:30.918273645")
  trunc := []time.Duration{
    time.Nanosecond,
    time.Microsecond,
    time.Millisecond,
    time.Second,
    2 * time.Second,
    time.Minute,
    10 * time.Minute,
    time.Hour,
  }
  for _, d := range trunc {
    fmt.Printf("t.Truncate(%6s) = %s\n", d, t.Truncate(d).Format("15:04:05.999999999"))
  }
  }
image.png

12.返回格式化時間的字符串

func (d Duration) String() string

package main
import (
  "time"
  "fmt"
)
func main() {
  t:=time.Now()
  fmt.Println(t.String())
  }
image.png

13.獲取當前日期

func Now() Time

package main

import (
  "time"
  "fmt"
)
func main() {
   fmt.Println(time.Now())
 }
image.png

14.增加日期的偏移量

func (t Time) Add(d Duration) Time

package main

import (
  "time"
  "fmt"
)

func main() {
  tody := time.Now()
  tomorrow := tody.Add(time.Hour*24)
   fmt.Println(tody)
  fmt.Println(tomorrow)
 }
image.png

15.判斷日期是否在日期u之前

func (t Time) Before(u Time) bool

package main

import (
  "time"
  "fmt"
)

func main() {
  tody := time.Now()
  tomorrow := tody.Add(time.Hour*24)
   fmt.Println(tody.Before(tomorrow))
 }
image.png

16.判斷日期是否在日期u之前

func (t Time) After(u Time) bool

package main

import (
  "time"
  "fmt"
)

func main() {
  tody := time.Now()
  tomorrow := tody.Add(time.Hour*24)
   fmt.Println(tody.After(tomorrow))
 }

image.png

17.在當前日期上增加年月日的偏移量

func (t Time) AddDate(years int, months int, days int) Time

package main

import (
  "time"
  "fmt"
)

func main() {
  tody := time.Now()
   fmt.Println(tody)
  fmt.Println(tody.AddDate(1,1,1))
 }

image.png

18.獲取時分秒

func (t Time) Clock() (hour, min, sec int)

package main
import (
  "time"
  "fmt"
)
func main() {
  tody := time.Now()
  h,m,s := tody.Clock()
   fmt.Printf("%d:%d:%d",h,m,s)
 }

image.png

19.計算當前時間到指定時間的時間差

func (t Time) Sub(u Time) Duration

package main

import (
  "time"
  "fmt"
)

func main() {
  today := time.Now()
  tomorrow := today.Add(time.Hour * 12)
  d := today.Sub(tomorrow)
   fmt.Println(d.Hours())
 }
image.png

獲取時間戳

func (t Time) Unix() int64
func (t Time) UnixNano() int64

示例

package main

import (
  "time"
  "fmt"
)

func main() {
  today := time.Now()
  // 返回時間戳 單位s
   fmt.Println(today.Unix())
  // 返回時間戳 單位納秒
  fmt.Println(today.UnixNano())
 }
image.png

20.判斷兩個日期是否相等

func (t Time) Equal(u Time) bool

package main

import (
  "time"
  "fmt"
)

func main() {
  today := time.Now()
 fmt.Println(today.Equal(today))
 }
image.png

21.獲取零時區的日期

func (t Time) UTC() Time

package main

import (
  "time"
  "fmt"
)

func main() {
  today := time.Now()
 fmt.Println(today)
  fmt.Println(today.UTC())
 }
image.png

22.計算當前時區和零時區之間的偏移量

func (t Time) Zone() (name string, offset int)
Zone計算t所在的時區,返回該時區的規范名(如"CET")和該時區相對于UTC的時間偏移量(單位秒)

package main

import (
  "time"
  "fmt"
)

func main() {
  today := time.Now()
  name,offset := today.Zone()
 fmt.Println(name)
  fmt.Println(offset/3600)
 }
image.png

時差八個小時

23. 返回采用本地和本地時區

func (t Time) Local() Time

package main

import (
  "time"
  "fmt"
)

func main() {
  today := time.Now()
  local := today.Local()
 fmt.Println(today)
  fmt.Println(local)
 }
image.png

24.獲取指定時區的日期

func (t Time) In(loc *Location) Time

package main

import (
  "time"
  "fmt"
)

func main() {
  loc,_:= time.LoadLocation("UTC")
  today := time.Now()
  todayUTC := today.In(loc)
  fmt.Println(loc)
  fmt.Println(today)
  fmt.Println(todayUTC)
 }
image.png

25.通過年月日時分秒時區創建日期

func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time

示例

package main

import (
  "time"
  "fmt"
)

func main() {
  loc,_:=time.LoadLocation("UTC")
  date := time.Date(2018,5,12,12,8,0,12,loc)
  fmt.Println(date)
 }

image.png

26.獲取當前日期是當年的多少第幾周

![image.png](http://upload-images.jianshu.io/upload_images/1594482-ed4acdaa971be2cc?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

返回時間點t對應的ISO 9601標準下的年份和星期編號。星期編號范圍[1,53],1月1號到1月3號可能屬于上一年的最后一周,12月29號到12月31號可能屬于下一年的第一周。

示例

package main
import (
  "time"
  "fmt"
)
func main() {
  now:=time.Now()
  year,week := now.ISOWeek()
  fmt.Println(year)
  fmt.Println(week)
 }
image.png

27.日期是不是零值

January 1, year 1, 00:00:00 UTC

func (t Time) IsZero() bool

package main

import (
  "time"
  "fmt"
)

func main() {
  loc,_ := time.LoadLocation("UTC")
  now:=time.Date(1,1,1,0,0,0,0, loc)
  fmt.Println(now)
  fmt.Println(now.IsZero())
 }
image.png

28.創建時區

func LoadLocation(name string) (*Location, error)

package main

import (
  "time"
  "fmt"
)

func main() {
  loc,_ := time.LoadLocation("UTC")
  fmt.Println(loc)
 }
image.png

29.獲取時區的名稱

func (l *Location) String() string

package main

import (
  "time"
  "fmt"
)

func main() {
  loc,_ := time.LoadLocation("UTC")
  fmt.Println(loc.String())
 }
image.png

30.間隔觸發器的創建和停止

func NewTicker(d Duration) *Ticker
func (t *Ticker) Stop()
package main

import (
  "time"
  "fmt"
  )

func main() {
  ticker := time.NewTicker(time.Second)
  var i = 0
  c := ticker.C
  for date := range c{
    fmt.Println(date)
    i ++
    if i == 5 {
      ticker.Stop()
      break
    }

  }
}

image.png

31.延時異步執行

func AfterFunc(d Duration, f func()) *Timer

package main

import (
  "time"
  "fmt"
)

func main() {
  time.AfterFunc(time.Second, func() {
    fmt.Println("延時1s后執行")
  })

  time.Sleep(time.Second * 2)

}
image.png

32.定時器的創建和停止

func NewTimer(d Duration) *Timer
func (t *Timer) Reset(d Duration) bool
func (t *Timer) Stop() bool
package main

import (
  "time"
  "fmt"
)

func main() {
  timer := time.NewTimer(time.Second*1)
  c := <- timer.C
  fmt.Println(c)


  // 恢復
  d,_ := time.ParseDuration("2s")
  timer.Reset(d)
  c = <- timer.C
  fmt.Println(c)

  // 停止

  d,_ = time.ParseDuration("2s")
  timer.Reset(d)
  timer.Stop()
  c = <- timer.C
  fmt.Println(c)
}
image.png

注意一旦我們停止了定時器,就不能繼續對定時器的信道進行接受,否則程序出錯

33.解析數據

func Parse(layout, value string) (Time, error)
func ParseInLocation(layout, value string, loc *Location) (Time, error)
package main

import (
  "time"
  "fmt"
)

func main() {
  const longForm = "Jan 2, 2006 at 3:04pm (MST)"
  t, _ := time.Parse(longForm, "Feb 3, 2013 at 7:54pm (PST)")
  fmt.Println(t)

  const shortForm = "2006-01-02 15:04:05.000"
  t, _ = time.Parse(shortForm, "2006-01-02 15:04:05.000")
  fmt.Println(t)
}

image.png

34.將日期格式化成執行的字符串

func (t Time) Format(layout string) string
func ParseInLocation(layout, value string, loc *Location) (Time, error)

package main

import (
  "fmt"
  "time"
)

func main() {
  fmt.Println(time.Now().Format("2018-02-02 15:04:05.000"))
  // 必須寫下面的格式
  fmt.Println(time.Now().Format("2006-01-02 15:04:05.000"))
  fmt.Println(time.Now().Format("2006-01-02 15:04:05"))
}
image.png
package main

import (
  "fmt"
  "time"
)

func main() {
  loc, _ := time.LoadLocation("Europe/Berlin")
  const longForm = "Jan 2, 2006 at 3:04pm (MST)"
  t, _ := time.ParseInLocation(longForm, "Jul 9, 2012 at 5:02am (CEST)", loc)
  fmt.Println(t)
  // Note: without explicit zone, returns time in given location.
  const shortForm = "2006-Jan-02"
  t, _ = time.ParseInLocation(shortForm, "2012-Jul-09", loc)
  fmt.Println(t)
}

image.png

36.Unix創建一個本地時間,對應sec和nsec表示的Unix時間(從January 1, 1970 UTC至該時間的秒數和納秒數)。

package main

import (
  "fmt"
  "time"
)
func main() {
fmt.Println(time.Unix(10,0))
}
image.png

37.GobEncode實現了gob.GobEncoder接口

func (t *Time) GobDecode(data []byte) error

package main

import (
  "fmt"
  "time"
)

func main() {
  // 序列化
  data,_ := time.Now().GobEncode()
  fmt.Println(data)
  date := time.Now()
  //反序列化
  date.GobDecode(data)
  fmt.Println(date)
}
image.png

三種序列化和反序列化操作

// 序列化
func (t Time) MarshalBinary() ([]byte, error)
func (t Time) MarshalJSON() ([]byte, error)
func (t Time) MarshalText() ([]byte, error)

// 反序列化
func (t *Time) UnmarshalBinary(data []byte) error
func (t *Time) UnmarshalJSON(data []byte) error
func (t *Time) UnmarshalText(data []byte) error
package main

import (
  "fmt"
  "time"
)

func main() {
  // 序列化
  data,_ := time.Now().MarshalBinary()
  fmt.Println(data)
  date := time.Now()
  //反序列化
  date.UnmarshalBinary(data)
  fmt.Println(date)

  data,_ = time.Now().MarshalText()
  fmt.Printf("MarshalText:%s\n",string(data))
  date = time.Now()
  //反序列化
  date.UnmarshalText(data)
  fmt.Println(date)

  data,_ = time.Now().MarshalJSON()
  fmt.Printf("MarshalJSON:%s\n",string(data))
  date = time.Now()
  //反序列化
  date.UnmarshalJSON(data)
  fmt.Println(date)

}
image.png

但將文本表示附加b到緩沖區,并返回緩沖區

func (t Time) AppendFormat(b []byte, layout string) []byte

package main

import (
  "fmt"
  "time"
)

func main() {
  data:= time.Now().AppendFormat([]byte("當前日期為:"),"2006-01-02")
  fmt.Println(string(data))
}

image.png
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容