zoukankan      html  css  js  c++  java
  • 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

    ~~~

  • 相关阅读:
    MongoDB数据类型
    杭电1257
    杭电1716
    杭电1997
    杭电1492
    杭电1208
    杭电1290
    杭电1087
    杭电1568
    杭电1398
  • 原文地址:https://www.cnblogs.com/paulwhw/p/14216979.html
Copyright © 2011-2022 走看看