天天看點

golang time相關總結前言擷取目前時間對象時間戳相關時間格式化解析字元串類型的時間其他時間相關函數時間戳和時間格式之間的轉換

前言

我們在php中對于時間操作主要是用時間戳和時間格式互相轉換來計算,一般都是用時間戳進行計算,用時間格式進行展示,相對來說還是比較友善的。在golang中是有些差別的,主要是多了一個time對象,接下來我們來看一看

擷取目前時間對象

在golang中,我們常用time.Now()來擷取目前的時間

now := time.Now()  //時間對象
fmt.Println(now)
******************
列印結果
2020-07-07 11:12:48.795021 +0800 CST m=+0.000757041           

複制

而且我們可以根據時間對象擷取目前的年月日時分秒

year := now.Year()
month := now.Month()
day := now.Day()
hour := now.Hour()
minute := now.Minute()
second := now.Second()
fmt.Println(year, month, day, hour, minute , second)
fmt.Printf("%d-%d-%d %d:%d:%d\n", now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second())

**************************
列印結果
2020 July 7 16 56 45
2020-7-7 16:56:45           

複制

時間戳相關

擷取目前時間戳(毫秒和納秒)

timestamp1 := now.Unix()
timestamp2 := now.UnixNano()  //納秒
fmt.Println(timestamp1, timestamp2)
*****************
列印結果
1594091568      1594091568795021000           

複制

把指定的時間戳轉換為時間對象

t := time.Unix(1593654704, 0)  //第二個參數為納秒,一般都寫0
fmt.Println(t)
***********
列印結果
2020-07-02 09:51:44 +0800 CST           

複制

時間格式化

在咱們了解時間格式化之前,一定要記住這個時間

2006-01-02 15:04:05 這個時間據說是golang的上線時間,所有時間都依據于這個

其實也很好記 2006年 12345 3是24小時制的 就可以了

timeFormat := now.Format("2006.01.02::15.04.05")
timeFormat2 := now.Format("2006.01.02::03.04.05 PM")
fmt.Println(timeFormat)
fmt.Println(timeFormat2)
*********輸出結果
2020.07.07::14.42.37
2020.07.07::02.42.37 PM           

複制

解析字元串類型的時間

timeStr :="2020/07/02 14:00:00"
    loc, err := time.LoadLocation("Asia/Shanghai")
    if err != nil{
        fmt.Println("err:", err)
        return
    }
    timeObj1, err := time.Parse("2006/01/02 15:04:05", timeStr)
    if err != nil{
        fmt.Println("err :", err)
        return
    }
    timeObj2, err := time.ParseInLocation("2006/01/02 15:04:05", timeStr, loc)
    if err != nil{
        fmt.Println("err :", err)
        return
    }
    fmt.Println(timeObj1)
    fmt.Println(timeObj2)
*******輸出
2020-07-02 14:00:00 +0000 UTC
2020-07-02 14:00:00 +0800 CST           

複制

其他時間相關函數

時間間隔

n := time.Duration(2)
time.Sleep(n*time.Second)           

複制

時間加減操作

now := time.Now()       // 目前 datetime時間
tomorrow := now.AddDate(0, 0, +1)   // 一天之後的時間  三個參數分别為  年 月  日
fmt.Println(tomorrow)
day_after_15 := now.AddDate(0, 0, -15)  // 15天之前的時間
fmt.Println(day_after_15)
**********輸出結果
2020-07-08 17:31:56.433365 +0800 CST
2020-06-22 17:31:56.433365 +0800 CST           

複制

now := time.Now()       // 目前 datetime時間
// 10分鐘前
m, _ := time.ParseDuration("-10m")
m1 := now.Add(m)
fmt.Println(m1)

// 8個小時前
h, _ := time.ParseDuration("-1h")
h1 := now.Add(8 * h)
fmt.Println(h1)

// 一天前
d, _ := time.ParseDuration("-24h")
d1 := now.Add(d)
fmt.Println(d1)

subM := now.Sub(m1)
fmt.Println(subM.Minutes(), "分鐘")

sumH := now.Sub(h1)
fmt.Println(sumH.Hours(), "小時")

sumD := now.Sub(d1)
fmt.Printf("%v 天\n", sumD.Hours()/24)
************輸出結果
2020-07-07 17:58:55.322775 +0800 CST m=+0.000879113
2020-07-07 17:48:57.325396 +0800 CST m=-597.996547788
2020-07-07 09:58:57.325396 +0800 CST m=-28797.996547788
2020-07-06 17:58:57.325396 +0800 CST m=-86397.996547788
10 分鐘
8 小時
1 天           

複制

時間戳和時間格式之間的轉換

在php中我們一般可以直接轉換,golang中需要先把各自轉換為時間對象,然後再轉換成對應的類型

格式化時間顯示

// 擷取目前時間,進行格式化

    fmt.Println(time.Now().Format("2006-01-02 15:04:05"))

    // output: 2016-07-27 08:57:46


    // 時間戳轉換為時間格式
方法1:
  先把時間轉換為時間對象  time.Unix(1469579899, 0)  然後再Format成時間格式
    fmt.Println(time.Unix(1469579899, 0).Format("2006-01-02 15:04:05"))

    // output: 2016-07-27 08:38:19

方法2:
// 擷取指定時間戳的年月日,小時分鐘秒
    t := time.Unix(1469579899, 0)
    fmt.Printf("%d-%d-%d %d:%d:%d\n", t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second())
    // output: 2016-7-27 8:38:19           

複制

時間字元串轉時間戳

// 先用time.Parse對時間字元串進行分析,如果正确會得到一個time.Time對象
// 後面就可以用time.Time對象的函數Unix進行擷取

t2, err := time.Parse("2006-01-02 15:04:05", "2016-07-27 08:46:15")
  if err != nil {
        log.Fatalln(err)
   }
   fmt.Println(t2)
   fmt.Println(t2.Unix())

    // output:

    //     2016-07-27 08:46:15 +0000 UTC

    //     1469609175           

複制