golang时间操作基础

时间常量

const (
    Nanosecond  Duration = 1   // 纳秒
    Microsecond          = 1000 * Nanosecond  // 微妙
    Millisecond          = 1000 * Microsecond   // 毫秒
    Second               = 1000 * Millisecond   //
    Minute               = 60 * Second   // 分钟
    Hour                 = 60 * Minute   // 小时
)
time.Second // 代表1秒
100 * time.Millisecond  // 代表100毫秒

时间直接转时间戳为秒/纳秒的情况

时间转时间戳可以得到秒/纳秒两种计量单位,根据上面时间常量的转换关系,如果需要毫秒级别的时间戳的话,直接使用纳秒的结果除以 1e6 即可:

// 时间转时间戳
now := time.Now()

// 单位是秒的结果:
nowStampSecond := now.Unix()
fmt.Println(nowStampSecond) // 1608360244  10位


// 单位是毫秒的结果(先转成纳秒再除以 1e6)
nowStampmilli := now.UnixNano() / 1e6
fmt.Println(nowStampmilli) // 1608360325543  13位

获取当前时间与获取一个指定时区的时间

// 当地的时区
TIME_LOCATION_CST, _ := time.LoadLocation("Asia/Shanghai")
// 获取当前时间
now := time.Now()

// 将时间转成本地时区,指向的是同一个时间点
fmt.Println(now.Local()) // 2020-12-19 14:59:12.848224 +0800 CST

// 将时间转换为0时区的时间
fmt.Println(now.UTC()) // 2020-12-19 06:59:12.848224 +0000 UTC

// 根据指定值返回一个时间 用的是 Asia/Shanghai时区
ret := time.Date(2019,02,23,10,22,33,0,TIME_LOCATION_CST)
fmt.Println(ret) // 2019-02-23 10:22:33 +0800 CST 

时间字符串转时间1 (建议)

注意!这里的时间字符串一定要带上时区!

  // 当地的时区
    TIME_LOCATION_CST, _ := time.LoadLocation("Asia/Shanghai")

    // 时间字符串转时间
    timeStr := "2020-12-22T13:33:15+0800"
    if timeRet, err := time.ParseInLocation("2006-01-02T15:04:05+0800", timeStr, TIME_LOCATION_CST); err == nil{
        fmt.Printf("timeRet: %v, %T 
", timeRet, timeRet)
        /* timeRet: 2020-12-22 13:33:15 +0800 CST, time.Time  */
    }else{
        fmt.Println("err>> ",err)
    }    

时间字符串转时间2(不建议)

注意:即使字符串带时区,使用Parse方法依然默认会转成UTC时间!

因为Parse源码里面直接使用的UTC去转的!不推荐这种方式!

  // 时间字符串转时间
    timeStr := "2020-12-22T13:33:15+0800"
    if timeRet, err := time.Parse("2006-01-02T15:04:05+0800", timeStr); err == nil{
        fmt.Printf("timeRet: %v, %T 
", timeRet, timeRet)
        /* timeRet: 2020-12-22 13:33:15 +0000 UTC, time.Time  */
    }else{
        fmt.Println("err>> ",err)
    }

时间转化为字符串

  // 时间字符串转时间
    timeFormatStr := "2006-01-02T15:04:05+0800"
    now := time.Now()
    fmt.Println(now) // 2020-12-19 15:26:47.337952 +0800 CST m=+0.000669128
    
    // 指定格式
    timeNowStr := now.Format(timeFormatStr)
    fmt.Println(timeNowStr) // 2020-12-19T15:26:47+0800
    
    // 固定格式
    tiemNowStr2 := now.String()
    fmt.Println(tiemNowStr2) // 2020-12-19 15:26:47.337952 +0800 CST m=+0.000669128

时间戳转时间

使用 time.Unix 方法,注意 time.Unix 方法的第一个参数的单位是秒!如果传来的时间戳是毫秒级别的话,记得除以1000!

    // 毫秒级别的时间戳
    tiemStamp := 1608409607000

    // 时间戳转时间
    // 如果第一个参数是毫秒的话,需要除以1000转成秒!第二个参数是偏移,设置成0就行
    ret := time.Unix(int64(tiemStamp / 1000), 0)
    fmt.Printf("ret: %v, %T 
", ret, ret)
    // ret: 2020-12-20 04:26:47 +0800 CST, time.Time 

获取time对象包含年/月/日/时/分/秒/周的一些方法

  now := time.Now()
    
    // 当前时间对应的 年、月、日
    year, month, day := now.Date()
    fmt.Println(fmt.Sprintf("year: %d, month: %d, day: %d 
", year, month, day))
    /* year: 2020, month: 12, day: 19 */

    // 当前时间对应的是 时、分、秒
    hour, minute, second := now.Clock()
    fmt.Println(fmt.Sprintf("hour: %d, minute: %d, second: %d 
", hour, minute, second))
    /* hour: 14, minute: 52, second: 31  */

    // 当前时间是一周的周几
    weekDay := now.Weekday()
    fmt.Println(weekDay) // Saturday 

时间比较与运算相关

// 当地的时区
    TIME_LOCATION_CST, _ := time.LoadLocation("Asia/Shanghai")

    now := time.Now()
    // 自己创造一个时间
    createTime := time.Date(2019,02,23,10,22,33,0,TIME_LOCATION_CST)

    fmt.Println(now)
    fmt.Println(createTime)
    /*
    2020-12-19 15:44:55.196377 +0800 CST m=+0.000776951
    2019-02-23 10:22:33 +0800 CST
    */

    // 比较两个时间是否相等
    fmt.Println(now.Equal(createTime)) // false

    // now 是否在 createTime之前
    fmt.Println(now.Before(createTime)) // false

    // now是否在 createTime之后
    fmt.Println(now.After(createTime)) // true

    // ---------------------------------------------------
    // now 与 createTime 的时间差
    timeDuration := now.Sub(createTime)
    fmt.Println("timeDuration>> ",timeDuration) // 15965h15m5.224671s

    // 时间差的小时数
    fmt.Println(timeDuration.Hours()) // 15965.271575873056

    // 时间差的分钟数
    fmt.Println(timeDuration.Minutes()) // 957916.80486195

    // 时间差的秒数
    fmt.Println(timeDuration.Seconds()) // 5.7475023995509e+07

    // 时间段用字符串表示
    fmt.Printf("ret.String(): %v, %T 
", timeDuration.String(), timeDuration.String())
    /* ret.String(): 15965h18m48.126891s, string  */

    // 当前时间点 +1 天 (前面2个是年 月)
    tomorrow := now.AddDate(0,0,1)
    fmt.Println(tomorrow) // 2020-12-20 15:43:54.56172 +0800 CST

    // 当前时间 +Durations
    after := now.Add(100)
    fmt.Println(after) // 2020-12-19 15:44:55.1963771 +0800 CST m=+0.000777051

~~~

原文地址:https://www.cnblogs.com/paulwhw/p/14216979.html