Time包

time包学习练习测试

时间类型:time.Time

获取当前时间对象time.Now(),然后就可以通过这个时间对象获得详细的时间信息了,包括年月日时分秒等信息。

func main() {
    //初始化一个新的时间对象
    now := time.Now()
    //now类型为time.Time
    fmt.Printf("now:\nType:%T \nvilue:%v \n", now, now)

    //拿到当前的年份信息,数据类型int
    year := now.Year()
    fmt.Printf("year:\nType:%T value:%#v \n", year, year)

    //拿到当前的月份信息,数据类型time.Month
    month := now.Month()
    fmt.Printf("month:\nType:%T value:%#v \n", month, month)

    //今天几号?数据类型:int
    day := now.Day()
    fmt.Printf("day:\nType:%T value:%#v \n", day, day)

    //时,数据类型:int
    hour := now.Hour()
    fmt.Printf("hour:\nType:%T value:%#v \n", hour, hour)

    //分:数据类型:int
    minute := now.Minute()
    fmt.Printf("minute:\nType:%T value:%#v \n", minute, minute)

    //秒:数据类型:int
    second := now.Second()
    fmt.Printf("second:\nType:%T value:%#v \n", second, second)
}

为啥这么奇怪只有月份是time.Month类型,年日时分秒都是int类型~~

时间戳

时间戳是自1970年1月1日(08:00:00GMT)至当前时间的总毫秒数。它也被称为Unix时间戳(UnixTimestamp)。基于时间对象获取时间戳的示例代码如下:

func main() {
    //初始化一个新的时间对象
    now := time.Now()
    //now类型为time.Time
    fmt.Printf("now:\nType:%T \nvilue:%v \n", now, now)

    //毫秒时间戳数据类型:int64
    uinx := now.Unix()
    fmt.Printf("Uinx:\nType:%T \nvilue:%v \n", uinx, uinx)

    //纳秒时间戳数据类型:int64
    uinxnano := now.UnixNano()
    fmt.Printf("UinxNano:\nType:%T \nvilue:%v \n", uinxnano, uinxnano)

}

把时间戳换回时间对象,转换以后的数据等同于time.Now()

func main() {
    //初始化一个新的时间对象
    now := time.Now()
    //now类型为time.Time
    fmt.Printf("now:\nType:%T \nvilue:%v \n", now, now)

    //毫秒时间戳数据类型:int64
    uinx := now.Unix()
    // fmt.Printf("Uinx:\nType:%T \nvilue:%v \n", uinx, uinx)

    //把时间戳转换为时间对象,time.Time类型。转换以后就是time.Now()
    timeOBJ := time.Unix(uinx, 0)
    fmt.Printf("timeOBJ:\nType:%T \nvilue:%v \n", timeOBJ, timeOBJ)
}

时间间隔

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秒。

时间操作

Add

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

func main() {
    //初始化一个新的时间对象
    now := time.Now()
    //now类型为time.Time
    fmt.Printf("now:\nType:%T \nvilue:%v \n", now, now)

    //now2当前时间加上24小时
    now2 := now.Add(time.Hour * 23)
    fmt.Printf("now2:\nType:%T \nvilue:%v \n", now2, now2)

    //当前时间减去now2,返回的是这两个时间之间隔多长时间,允许后now3是-24h0m0s
    now3 := now.Sub(now2)
    fmt.Printf("now3:\nType:%T \nvilue:%v \n", now3, now3)
}
ParseDuration

ParseDuration解析一个时间段字符串。一个时间段字符串是一个序列,每个片段包含可选的正负号十进制数、可选的小数部分单位后缀,如300ms-1.5h2h45m。合法的单位有nsus /µsmssmh。说人话就是把类似与2h3m45s解析为time.Duration类型数据,看下例:
解析字符串格式是时间为k

func main() {
    //合法的字符串时间间隔
    a := "2h32m50s"
    fmt.Printf("a:\nType:%T Value:%#v \n", a, a)
    //解析合法的字符串类型时间间隔为time.Duration类型
    b, err := time.ParseDuration(a)
    if err != nil {
        fmt.Printf("time.ParseDuration()参数有误,无法识别。\nErr:%v \n", err)
    }
    fmt.Printf("b:\nType:%T Value:%#v \n", b, b)
}

休眠函数time.Sleep()

func main() {
    fmt.Println("开始休眠~~~")
    //time.Sleep()休眠函数
    time.Sleep(time.Second * 3)
    fmt.Println("3秒钟过去了~~~")
}

定时器函数time.Tick()

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

func main() {
    a := time.Tick(time.Second * 2)
    fmt.Printf("a: \nType:%T value:%#v \n", a, a)
    //这里要用for rangge来遍历a,来获得定时执行任务的时间间隔
    for i := range a {
        fmt.Printf("i: \nType:%T value:%#v \n", i, i)
    }
}

比较时间

time.Beforetime.After比较两个时间的先后顺序。

func main() {
    //now为当前时间
    now0 := time.Now()
    //now为当前时间加25个小时
    now1 := now0.Add(time.Hour * 25)
    //Before函数比较now0和now1,如果now0在前返回true,否则返回false
    fmt.Println(now0.Before(now1))
    //After函数如果now0在now1之后返回true,否则返回false
    fmt.Println(now0.After(now1))
}

Equal

func (t Time) Equal(u Time) bool

判断两个时间是否相同,会考虑时区的影响,因此不同时区标准的时间也可以正确比较。本方法和用t==u不同,这种方法还会比较地点和时区信息。

时区转换

func main() {
    //设定时区为b,此时b的数据类型为*time.Location
    b, err := time.LoadLocation("Asia/Shanghai")
    if err != nil {
        fmt.Println(err)
    }
    fmt.Printf("b: \nType:%T \nValue:%v \n", b, b)

    //now为当前系统默认时区时间
    now0 := time.Now()
    //把获取到的系统时间转换为上海时间。
    a := now0.In(b)
    fmt.Printf("a: \nType:%T \nValue:%v \n", a, a)
}

  转载请注明: So Cold Time包

 上一篇
Fmt包 Fmt包
fmt标准库学习测试fmt.Print系列输出到终端,fmt.Sprint系列输出到变量,实际就是拼接字符串fmt.Fprint系列输出到文件fmt.Scan系列从标准输入读取fmt.Fscan系列从文件中读取fmt.Sscan系列从字符串
2020-05-04
下一篇 
Go语言反射 Go语言反射
背景先看官方Doc中Rob Pike给出的关于反射的定义: Reflection in computing is the ability of a program to examine its own structure, particu
2020-04-28
  目录