0
点赞
收藏
分享

微信扫一扫

【Go】常用时间和日期相关的函数

caoxingyu 2022-05-01 阅读 73
golang

文章目录

type Time

type Time struct {
	// 内含隐藏或非导出字段
}
  • Time代表一个纳秒精度的时间点
  • 程序中应使用Time类型值来保存和传递时间,而不能用指针。就是说,表示时间的变量和字段,应为time.Time类型,而不是*time.Time.类型。一个Time类型值可以被多个go程同时使用。时间点可以使用Before、After和Equal方法进行比较。Sub方法让两个时间点相减,生成一个Duration类型值(代表时间段)。Add方法给一个时间点加上一个时间段,生成一个新的Time类型时间点
  • Time零值代表时间点January 1, year 1, 00:00:00.000000000 UTC。因为本时间点一般不会出现在使用中,IsZero方法提供了检验时间是否显式初始化的一个简单途径
  • 每一个时间都具有一个地点信息(及对应地点的时区信息),当计算时间的表示格式时,如Format、Hour和Year等方法,都会考虑该信息。Local、UTC和In方法返回一个指定时区(但指向同一时间点)的Time。修改地点/时区信息只是会改变其表示;不会修改被表示的时间点,因此也不会影响其计算

函数【Now】返回当前本地时间

func Now() Time

案例演示:

package main

import (
	"fmt"
	"time"
)

func main() {
	var now = time.Now()
	fmt.Printf("now的值:%v\nnow的类型:%T", now, now)
}

/*结果:
now的值:2022-04-30 09:58:39.2036084 +0800 CST m=+0.003287701
now的类型:time.Time
*/

方法【Year】返回时间点t对应的年份

func (t Time) Year() int

方法【Month】返回时间点t对应那一年的第几月

func (t Time) Month() Month

方法【Day】返回时间点t对应那一月的第几日

func (t Time) Day() int

方法【Hour】返回t对应的那一天的第几小时,范围[0, 23]

func (t Time) Hour() int

方法【Minute】返回t对应的那一小时的第几分种,范围[0, 59]

func (t Time) Minute() int

方法【Second】返回t对应的那一分钟的第几秒,范围[0, 59]

func (t Time) Second() int

对以上【年月日时分秒】方法的代码演示

package main

import (
	"fmt"
	"time"
)

func main() {
	var now = time.Now()
	fmt.Println("完整时间:", now)
	fmt.Println("年:", now.Year())
	fmt.Println("月:", now.Month())
	fmt.Println("日:", now.Day())
	fmt.Println("时:", now.Hour())
	fmt.Println("分:", now.Minute())
	fmt.Println("秒:", now.Second())
}

/*结果:
完整时间: 2022-04-30 10:16:39.2420416 +0800 CST m=+0.003356701
年: 2022
月: April
日: 30
时: 10
分: 16
秒: 39
*/

  • 我们可以观察得到now.Month()的类型为time.Month,这不符合中文的数字月份表示,我们可以将其转换
package main

import (
	"fmt"
	"time"
)

func main() {
	var now = time.Now()
	fmt.Printf("now.Month()的值:%v\n", now.Month())
	fmt.Printf("now.Month()的类型:%T\n", now.Month())

	fmt.Printf("now.Month()的值的数字表示:%d\n", now.Month())
	fmt.Printf("now.Month()的值的数字表示:%v\n", int(now.Month()))
}

/*结果:
now.Month()的值:April
now.Month()的类型:time.Month
now.Month()的值的数字表示:4
now.Month()的值的数字表示:4
*/

方法【Format】根据layout指定的格式返回t代表的时间点的格式化文本表示

func (t Time) Format(layout string) string
layout定义了参考时间:
Mon Jan 2 15:04:05 -0700 MST 2006
格式化后的字符串表示,它作为期望输出的例子。
同样的格式规则会被用于格式化时间。

案例演示:

package main

import (
	"fmt"
	"time"
)

func main() {
	var now = time.Now()
	// 以下的数字都是固定的值,不能更换
	fmt.Println(now.Format("2006")) // 2022
	fmt.Println(now.Format("01"))   // 04
	fmt.Println(now.Format("02"))   // 30
	fmt.Println(now.Format("15"))   // 10
	fmt.Println(now.Format("04"))   // 52
	fmt.Println(now.Format("05"))   // 16

	// 数字之外的其它字符可以更换
	fmt.Println(now.Format("2006/01/02 15:04:05")) // 2022/04/30 10:52:16
	fmt.Println(now.Format("2006-01-02 15:04:05")) // 2022-04-30 10:52:16
}

方法【Unix】将t表示为Unix时间,即从时间点January 1, 1970 UTC到时间点t所经过的时间(单位秒)

func (t Time) Unix() int64

案例演示:

package main

import (
	"fmt"
	"time"
)

func main() {
	fmt.Println(time.Now().Unix()) // 1651293106
}

方法【UnixNano】将t表示为Unix时间,即从时间点January 1, 1970 UTC到时间点t所经过的时间(单位纳秒)

func (t Time) UnixNano() int64
如果纳秒为单位的unix时间超出了int64能表示的范围,结果是未定义的。
注意这就意味着Time零值调用UnixNano方法的话,结果是未定义的。

案例演示:

package main

import (
	"fmt"
	"time"
)

func main() {
	fmt.Println(time.Now().UnixNano()) // 1651293143679933100
}

type Duration

type Duration int64
  • Duration类型代表两个时间点之间经过的时间,以纳秒为单位。可表示的最长时间段大约290年
const (
    Nanosecond  Duration = 1
    Microsecond          = 1000 * Nanosecond
    Millisecond          = 1000 * Microsecond
    Second               = 1000 * Millisecond
    Minute               = 60 * Second
    Hour                 = 60 * Minute
)
  • 常用的时间段。没有定义一天或超过一天的单元,以避免夏时制的时区切换的混乱
  • 要将Duration类型值表示为某时间单元的个数,用除法
second := time.Second
fmt.Println(int64(second/time.Millisecond)) // 1000
  • 要将整数个某时间单元表示为Duration类型值,用乘法
seconds := 10
fmt.Println(time.Duration(seconds)*time.Second) // 10s
  • 案例演示:
package main

import (
	"fmt"
	"time"
)

func main() {
	fmt.Println(time.Hour)        // 1h0m0s
	fmt.Println(time.Minute)      // 1m0s
	fmt.Println(time.Second)      // 1s
	fmt.Println(time.Millisecond) // 1ms
	fmt.Println(time.Microsecond) // 1µs
	fmt.Println(time.Nanosecond)  // 1ns
}

func Sleep(d Duration)

  • Sleep阻塞当前go程至少d代表的时间段。d<=0时,Sleep会立刻返回
  • 案例演示:每隔0.1秒就打印一个数字,打印完100后退出
package main

import (
	"fmt"
	"time"
)

func main() {
	var num = 1
	for {
		fmt.Printf("%v ", num)
		if num == 100 {
			break
		}
		num++
		time.Sleep(time.Second / 10)
	}
}

日期和时间的课堂练习

  • 统计函数的执行时间
package main

import (
	"fmt"
	"strconv"
	"time"
)

func test() {
	var str = ""
	for i := 0; i < 100000; i++ {
		str += strconv.Itoa(i)
	}
}

func main() {
	var start = time.Now().Unix()
	test()
	var end = time.Now().Unix()
	fmt.Printf("函数test执行时间为%v秒", end-start)
	// 函数test执行时间为2秒
}

举报

相关推荐

0 条评论