• time:时间就是生命


    golang中的time包是用来处理时间的。

    1.时间的基本属性

    package main
    
    import (
    	"fmt"
    	"strings"
    	"time"
    )
    
    func main() {
    	//golang中的时间是一个time.Time结构体类型
    
    	// 1.获取当前时间
    	now := time.Now()
    	fmt.Println(now) // 2019-08-28 22:26:09.944995 +0800 CST m=+0.003962701
    	fmt.Printf("时间的类型:%#v
    ", now) // 时间的类型:time.Time{wall:0xbf51c1a078537ab8, ext:3962701, loc:(*time.Location)(0x57bfe0)}
    
    	//2.获取对应的年月日时分秒
    	fmt.Printf("year is %d,month is %d, day is %d
    ", now.Year(), now.Month(), now.Day()) // year is 2019,month is 8, day is 28
    	fmt.Printf("hour is %d,minute is %d, second is %d
    ", now.Hour(), now.Minute(), now.Second()) // hour is 22,minute is 28, second is 23
    	fmt.Printf("一周当中的第几天:%d,一年当中的第几天:%d
    ", now.Weekday(), now.YearDay()) // 一周当中的第几天:3,一年当中的第几天:240
    	//打印当前时区
    	fmt.Println(now.Zone()) // CST 28800
    
    	//转化为字符串类型
    	fmt.Printf("%s|||||%t
    ", now.String(), strings.HasPrefix(now.String(), "2019-08-28"))  // 2019-08-28 22:36:03.6088057 +0800 CST m=+0.003989601|||||true
    
    	//只打印年月日
    	fmt.Println(now.Date()) // 2019 August 28
    }
    

    2.时间戳

    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    func main() {
    	now := time.Now()
    	//获取时间戳
    	fmt.Printf("时间戳:%d,纳秒时间戳:%d
    ", now.Unix(), now.UnixNano()) // 时间戳:1567003243,纳秒时间戳:1567003243127399800
    
    	//将时间戳转化为时间格式,第二个参数表示偏移量,表示便宜多少纳秒,一般写0即可
    	fmt.Println(time.Unix(1567003243 + 3600, 0))  // 2019-08-28 23:40:43 +0800 CST
    }
    

    3.时间间隔

    package main
    
    import (
    	"time"
    )
    
    func main() {
    	//golang里面定义了很多关于时间的常量
    	/*
    	const (
    		Nanosecond  Duration = 1  纳秒
    		Microsecond          = 1000 * Nanosecond 微秒
    		Millisecond          = 1000 * Microsecond 毫秒
    		Second               = 1000 * Millisecond 秒
    		Minute               = 60 * Second 分钟
    		Hour                 = 60 * Minute 小时
    	)
    	 */
    	time.Sleep(1) // 睡眠,如果写上一个1,表示睡眠1纳秒
    	time.Sleep(time.Second) // 睡1秒
    }
    

    4.时间格式化

    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    func main() {
    	//将字符串的时间转成golang中的时间类型
    	s := "2018-11-21 12:35:24"
    	//golang中没有%Y-%m-%d %H:%M:%S这种格式,而是使用2006-01-02 15:04:05这种格式
    	//为什么呢?因为官方说这是golang的诞生时间,所以必须使用这个模板进行格式化,关于里面的15,表示的是下午3点,也可以写成03
    	//或者简写成2006-1-2 3:4:5也行,表示2006年1月2号 下午3点4分5秒,2006 1 2 3 4 5,比较好记
    	t, err := time.Parse("2006-1-2 3:4:5", s)
    	if err != nil {
    		fmt.Println(err)
    	}else {
    		fmt.Println(t) // 2018-11-21 12:35:24 +0000 UTC
    		fmt.Println(t.Year()) // 2018
    		fmt.Println(t.Month()) // November
    		fmt.Println(t.Day()) // 21
    	}
    
    	//日期转成时间
    	now := time.Now()
    	//可以像我们之前用的直接使用String,但是这样不是我们想要的
    	fmt.Println(now.String()) // 2019-08-28 23:08:14.9255387 +0800 CST m=+0.004986701
    	//使用Format格式化,输入格式,但是注意的是,我们之前说 6 1 2 3 4 5,
    	//注意这里的小时,我们可以写15 也可以写3,但是写3的话,就不知道到底是上午的11点,还是下午的11点
    	//所以我们还是最好写15,这样不会有歧义,11就表示上午的11,如果晚上则是23
    	fmt.Println(now.Format("2006-1-2 3:4")) // 2019-8-28 11:8
    	fmt.Println(now.Format("2006-1-2 15:4")) // 2019-8-28 23:8
    }
    

    5.定时器

    定时器需要搭配channel使用

    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    func main() {
    	//当我这样的定义的时候,两秒钟之后,time.C里面就会有值
    	timer := time.NewTimer(time.Second * 2)
    	//如果没到2秒,那么这里会卡住,因为timer.C是一个channel,要2s后才会往里面写入值
    	//但是需要注意的是:并不是我调用了<-timer.C,才开始写入,而是当我调用NewTimer的时候就已经开始了
    	//如果我sleep两秒后,再调用<timer.C,那么会瞬间打印出值,因为2s已经过去了,timer.C里面已经有值了。
    	//这里会打印当前时间
    	fmt.Println(<-timer.C) // 2019-08-28 23:20:51.9973729 +0800 CST m=+2.004240601
    
    	//定时器的重置
    	//这里写成10s,那么要等到10秒之后,time.C里面才会有值
    	timer1 := time.NewTimer(time.Second * 10)
    	timer1.Reset(time.Second) //这里改成一秒
    	//那么1s后这里就会打印出值
    	fmt.Println(<-timer1.C)  // 2019-08-28 23:20:53.0093997 +0800 CST m=+3.016267401
    
    	//定时器的停止
    	timer2 := time.NewTimer(time.Second * 10)
    	timer2.Stop()
    	// fmt.Println(<-timer2.C)  一旦定时器停止,time2.C这个通道也就关闭了,如果再试图从timer2.C里面读取数据,就会造成死锁。
    }
    
    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    func main() {
    	//除了Timer,还有一个Ticker。和Timer用法一样,只不过Ticker是循环获取,Timer只获取一次
    	ticker := time.NewTicker(time.Second)
    	for i:=0;i<5;i++{
    		fmt.Printf("第%d次循环 %v
    ",i+1,(<-ticker.C).Format("2006-1-2 15:4:5"))
    		/*
    		第1次循环 2019-8-28 23:26:14
    		第2次循环 2019-8-28 23:26:15
    		第3次循环 2019-8-28 23:26:16
    		第4次循环 2019-8-28 23:26:17
    		第5次循环 2019-8-28 23:26:18
    		 */
    	}
    	//当然定时器也可以停止,但是无法重置,这里不再演示
    }
    
  • 相关阅读:
    记录docker 安装sonarqube和安装的一些坑
    Docker安装部署ELK教程 (Elasticsearch+Kibana+Logstash+Filebeat)
    使用docker创建rabbitmq服务
    Centos7下安装Docker
    使用 docker 搭建 MySQL 主从同步/读写分离
    sql优化建议
    记使用docker配置kafka
    6种@Transactional注解的失效场景
    linux定时任务之清理tomcat catalina.out日志
    持久层框架JPA与Mybatis该如何选型
  • 原文地址:https://www.cnblogs.com/traditional/p/11427241.html
Copyright © 2020-2023  润新知