• 3常用标准库之time


    一 基本使用

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

    func main() {
    	var now time.Time = time.Now()
    	fmt.Println(now)
    	year := now.Year()     //年
    	month := now.Month()   //月
    	day := now.Day()       //日
    	hour := now.Hour()     //小时
    	minute := now.Minute() //分钟
    	second := now.Second() //秒
    	fmt.Printf("%v年-%v月-%v日 %v时-%v分-%v秒",year,month,day,hour,minute,second)
    }
    

    二 时间戳

    时间戳是自1970年1月1日(08:00:00GMT)计算机与阿年,至当前时间的总毫秒数。它也被称为Unix时间戳(UnixTimestamp)。

    基于时间对象获取时间戳的示例代码如下:

    func main() {
    	var now time.Time = time.Now()
    	fmt.Println(now)
    	timestamp1 := now.Unix()      // 1979年到现在的秒数
    	timestamp2 := now.UnixMilli() // 1979年到现在的毫秒数  0.001秒
    	timestamp3 := now.UnixMicro() // 1979年到现在的微秒数  10的负6次秒
    	timestamp4 := now.UnixNano()  // 1979年到现在的纳秒数  10的负9次秒
    
    	fmt.Println(timestamp1)
    	fmt.Println(timestamp2)
    	fmt.Println(timestamp3)
    	fmt.Println(timestamp4)
    
    }
    

    使用time.Unix()函数可以将时间戳转为时间格式。

    func main() {
    	var now time.Time = time.Now()
    	fmt.Println(now)
    	timestamp1 := now.Unix() // 1979年到现在的秒数
    	timeObj := time.Unix(timestamp1, 0)  // 将时间戳转为时间格式
    
    	//timestamp2 := now.UnixMilli()
    	//timeObj := time.UnixMilli(timestamp2)
    
    	fmt.Println(timeObj)
    	year := timeObj.Year()     //年
    	month := timeObj.Month()   //月
    	day := timeObj.Day()       //日
    	hour := timeObj.Hour()     //小时
    	minute := timeObj.Minute() //分钟
    	second := timeObj.Second() //秒
    	fmt.Printf("%v年-%v月-%v日 %v时-%v分-%v秒", year, month, day, hour, minute, second)
    
    }
    

    三 时间间隔

    time.Durationtime包定义的一个类型,它代表两个时间点之间经过的时间,以纳秒为单位。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

    时间相加

    func (t Time) Add(d Duration) Time
    

    举个例子,求24个小时之后的时间:

    func main() {
    	var now time.Time = time.Now()
    	lastTime:=now.Add(24*time.Hour)
    	fmt.Println(lastTime)
    }
    

    4.2 Sub

    求两个时间之间的差

    func (t Time) Sub(u Time) Duration
    

    如果结果超出了Duration可以表示的最大值/最小值,将返回最大值/最小值。

    要获取时间点Time-Duration,可以使用t.Add(-Duration)

    计算俩时间对象的差,如果计算时间和时间间隔的差,使用Add

    func main() {
    	var start time.Time = time.Now()
    	var end=time.Now()
    	fmt.Println(end.Sub(start))
    }
    

    4.3 Equal

    func (t Time) Equal(u Time) bool
    

    判断两个时间是否相同,会考虑时区的影响,因此不同时区标准的时间也可以正确比较。

    本方法和用==(双等号)不同,这种方法还会比较地点和时区信息。

    4.4 Before

    func (t Time) Before(u Time) bool
    

    如果t代表的时间点在u之前,返回真;否则返回假。

    4.5 After

    func (t Time) After(u Time) bool
    

    如果t代表的时间点在u之后,返回真;否则返回假。

    func main() {
    	var start time.Time = time.Now()
    	var end=time.Now()
    	fmt.Println(end.Before(start))
    	fmt.Println(end.After(start))
    }
    

    五 时间格式化

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

    - 2006代指年(Y)
    - 01代指月(m)
    - 02代指日(d)
    - 15代指时(H)
    - 04代指分(M)
    - 05代指秒(S)
    
    //如果想格式化为12小时方式,需指定PM
    //小数部分想保留指定位数就写0,如果想省略末尾可能的0就写 9
    
    func main() {
    	var now time.Time = time.Now()
    	fmt.Println(now.Format("2006-01-02"))
    	fmt.Println(now.Format("2006年01月02日"))
    	fmt.Println(now.Format("2006-01-02 15:02:05"))
    	fmt.Println(now.Format("2006-01-02 03:04:05 PM"))
    	// 小数点后写0,因为有4个0所以格式化输出的结果也保留4位小数
    	fmt.Println(now.Format("2006-01-02 15:04:05.0000")) //2022-03-19 00:50:09.7412
    	// 小数点后写9,如果末尾是0,会省略
    	fmt.Println(now.Format("2006-01-02 15:04:05.9999")) 
    	// 只格式化时分秒部分
    	fmt.Println(now.Format("15:04:05"))
    	// 只格式化日期部分
    	fmt.Println(now.Format("2006.01.02"))
    
    }
    

    六 字符串格式化成时间

    func main() {
    	timeObj,err:=time.Parse("2006-01-02 15:04:05.9999","2022-03-19 00:10:42.96")
    	if err != nil {
    		fmt.Println("转换出错",err)
    	}
    	// 默认转成utc时间
    	fmt.Println(timeObj)
    	fmt.Println(timeObj.Year())
    	fmt.Println(timeObj.Month())
    	fmt.Println(timeObj.Day())
    	fmt.Println(timeObj.Hour())
    	fmt.Println(timeObj.Minute())
    	fmt.Println(timeObj.Second())
    	now:=time.Now()
    
    	res:=now.Sub(timeObj)
    	fmt.Println(res) // 当前时间减去转成的时间,发现差8个小时
    
    	//time.ParseInLocation函数需要在解析时额外指定时区信息。
    	// 按照指定时区和指定格式解析字符串时间
    	loc, err := time.LoadLocation("Asia/Shanghai")
    	timeObj2, err := time.ParseInLocation("2006-01-02 15:04:05", "2022-03-19 00:10:42", loc)
    	if err != nil {
    		fmt.Println(err)
    		return
    	}
    	fmt.Println(timeObj2)
    	res=now.Sub(timeObj2)
    	fmt.Println(res) // 这个时间正常
    }
    

    七 时区

    全球共分为24个时区。中国差不多跨5个时区,但为了使用方便只用东八时区的标准时即北京时间为准

    func main() {
    	shanghaiTime, err := time.LoadLocation("Asia/Shanghai") // 只支持重庆Asia/chongqin,上海Asia/Shanghai。。一些城市
    	//tokyo, err := time.LoadLocation("Asia/Tokyo")
    	if err != nil {
    		fmt.Println("加载出错", err)
    		return
    	}
    	fmt.Println(shanghaiTime)
    
    
    	// 创建时间对象需要指定位置。常用的位置是 time.Local(当地时间) 和 time.UTC(UTC时间)。
    	//timeInLocal := time.Date(2009, 1, 1, 20, 0, 0, 0, time.Local)  // 系统本地时间
    	timeInUTC := time.Date(2022, 3, 15, 12, 3, 4, 0, time.UTC)
    	sameTimeInBeijing := time.Date(2022, 3, 15, 20, 3, 4, 0, shanghaiTime)
    
    	// 北京时间(东八区)比UTC早8小时,所以上面两个时间看似差了8小时,但表示的是同一个时间
    	timesAreEqual := timeInUTC.Equal(sameTimeInBeijing)
    	fmt.Println(timesAreEqual)
    
    }
    

    八 Sleep睡眠

    func main() {
    	time.Sleep(3*time.Second)
    
    }
    

    八 定时器

    详见并发编程中定时器章节

  • 相关阅读:
    封装

    如何通过命令行窗口查看sqlite数据库文件
    标签控件
    信息提示框
    循环
    数组
    switch
    成员局部变量
    变量
  • 原文地址:https://www.cnblogs.com/liuqingzheng/p/16028165.html
Copyright © 2020-2023  润新知