golang中time包的使用

479 阅读4分钟

1.time.Now()获取时间基本信息

Time类型表示时间。我们可以通过time.Now()函数获取当前的时间对象,然后获取时间对象的年月日时分秒等信息

func getBaseTime(){
  now := time.Now()
  fmt.Println("基本信息",now)
  //基本信息 2021-07-27 10:39:49.946613 +0800 CST m=+0.000707429
  year :=now.Year() //年
  month := now.Month() //月
  day := now.Day() //日
  hour := now.Hour() //小时
  minute := now.Minute() //分
  second := now.Second() //秒
  fmt.Printf("%d-%02d-%02d %02d:%02d:%02d",year,month,day,hour,minute,second)
  //2021-07-27 10:43:53
}

2.时间戳Unix()

通过time.Now().Unix()获取

//10位数的时间戳是以 秒 为单位;
//13位数的时间戳是以 毫秒 为单位;
//19位数的时间戳是以 纳秒 为单位;
func getUnix(){
  now := time.Now()
  unix := now.Unix()
  fmt.Println("当前时间戳(秒)",unix)
  //当前时间戳(秒) 1627354773
  unixNano := now.UnixNano()
  fmt.Println("当前时间戳(纳秒)",unixNano)
  //当前时间戳(纳秒) 1627354895305439000
  unixHaoMiao := now.UnixNano()/1e6
  fmt.Println("当前时间戳(毫秒)",unixHaoMiao)
  //当前时间戳(毫秒) 1627354968330
  fmt.Printf("时间戳(纳秒转换为秒):%v;\n",time.Now().UnixNano() / 1e9)
  // 时间戳(纳秒转换为秒):1627354968;
}
//time.Unix()将时间戳转换为时间格式
func getTime(){
  unix := time.Now().Unix() //获取时间戳
  timeObj := time.Unix(unix,0)
  year := timeObj.Year() //同理 获取年月日 小时
  fmt.Println("时间戳",unix) //时间戳 1627355602
  fmt.Println("时间格式",timeObj) //时间格式 2021-07-27 11:13:22 +0800 CST
  fmt.Println("获取年",year) //获取年 2021
}

3.时间间隔

time.Duration是time包定义的一个类型,它代表两个时间点之间经过的时间,以纳秒为单位。time.Duration表示一段时间间隔,可表示的最长时间段大约290年

//time包中定义的时间间隔类型的常量如下
const (
    Nanosecond  Duration = 1
    Microsecond          = 1000 * Nanosecond
    Millisecond          = 1000 * Microsecond
    Second               = 1000 * Millisecond
    Minute               = 60 * Second
    Hour                 = 60 * Minute
)
//例如:time.Duration表示1纳秒,time.Second表示1秒。

4.时间操作

  1. Add()

我们在日常的编码过程中可能会遇到要求时间+时间间隔的需求,Go语言的时间对象有提供Add方法如下:

func timeAdd(){
   now := time.Now()
   lastTime := now.Add(time.Hour)  //间隔一个小时
   fmt.Println(now)
   fmt.Println(lastTime)
  //2021-07-27 11:26:52.521108 +0800 CST m=+0.000536457
  //2021-07-27 12:26:52.521108 +0800 CST m=+3600.000536457
  //lastTime := now.Add(-time.Hour)表示往前一个小时

}

2.Sub()

求两个时间之间的差值

func timeSub(){
strTime := time.Date(2021, 07, 27,1,0,0,0,time.Local)
lasTime := time.Date(2021, 07, 27,0,0,0,0,time.Local)
jg :=strTime.Sub(lasTime)
fmt.Println(jg)
//1h0m0s
}

3.Equal()

两个时间是否相等,需要考虑时区 返回Boolean类型

func timeEqual(){
   strTime := time.Date(2021, 07, 27,1,0,0,0,time.Local)
   lasTime := time.Date(2021, 07, 27,0,0,0,0,time.Local)
   jg :=strTime.Equal(lasTime)
   fmt.Println(jg)
   //false

}

4.Before()和After()

表示在时间之前和之后 返回Boolean类型

func timeBefore(){
   strTime := time.Date(2021, 07, 27,1,0,0,0,time.Local)
   lasTime := time.Date(2021, 07, 27,0,0,0,0,time.Local)
   jg :=strTime.Before(lasTime)
   jg2 :=strTime.After(lasTime)
   fmt.Println(jg) //false
   fmt.Println(jg2) //true
}

5.定时器

使用time.Tick(时间间隔)来设置定时器,定时器的本质上是一个通道(channel)。

func timeTick(){
  tick := time.Tick(time.second)  //定义一个一秒钟执行一次的定时器
  for i := range tick {
    fmt.Println(i)
  }
  //2021-07-27 11:56:33.433991 +0800 CST m=+77.005829903
  //2021-07-27 11:56:34.433991 +0800 CST m=+77.005829903
  //...
}

6.时间格式化

时间类型有一个自带的方法Format进行格式化,需要注意的是Go语言中格式化时间模板不是常见的Y-m-d H:M:S而是使用Go的诞生时间2006年1月2号15点04分(记忆口诀为2006 1 2 3 4)。也许这就是技术人员的浪漫吧。

补充:如果想格式化为12小时方式,需指定PM。

func timeFormat(){
   now := time.Now()
   fmt.Println(now.Format("2006-01-02"))
   //2021-07-27
}

解析字符串格式的时间

now := time.Now()
fmt.Println(now)
// 加载时区
loc, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
    fmt.Println(err)
    return
}
// 按照指定时区和指定格式解析字符串时间
timeObj, err := time.ParseInLocation("2006/01/02 15:04:05", "2019/08/04 14:15:20", loc)
if err != nil {
    fmt.Println(err)
    return
}
fmt.Println(timeObj)
fmt.Println(timeObj.Sub(now))