文章目录
- type Time
- 函数【Now】返回当前本地时间
- 方法【Year】返回时间点t对应的年份
- 方法【Month】返回时间点t对应那一年的第几月
- 方法【Day】返回时间点t对应那一月的第几日
- 方法【Hour】返回t对应的那一天的第几小时,范围[0, 23]
- 方法【Minute】返回t对应的那一小时的第几分种,范围[0, 59]
- 方法【Second】返回t对应的那一分钟的第几秒,范围[0, 59]
- 对以上【年月日时分秒】方法的代码演示
- 方法【Format】根据layout指定的格式返回t代表的时间点的格式化文本表示
- 方法【Unix】将t表示为Unix时间,即从时间点January 1, 1970 UTC到时间点t所经过的时间(单位秒)
- 方法【UnixNano】将t表示为Unix时间,即从时间点January 1, 1970 UTC到时间点t所经过的时间(单位纳秒)
- type Duration
- func Sleep(d Duration)
- 日期和时间的课堂练习
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秒
}