2.19 Go之time包:时间和日期
time包简介
- 
时间值 
- 
时区 
这一点在Go语言的time包源码当中可以看出
正确表示时间
国内使用的北京时间与UTC时间的关系:
UTC + 8个小时 = 北京时间
Go的time包下的时区变量:
- 
time.UTC:UTC时间
- 
time.Local:本地时间
Go获取时区变量的函数:
- 
LoadLocation
- 
FixedZone
LoadLocation:
FixedZone(name string, offset int) *Location
FixedZone:
LoadLocation(name string) (*Location, error)
参数name为时区的名字
时间的获取Practice
获取当前时间:
package main
import (
    "fmt"
    "time"
)
func main() {
    // 获取当前时间
    now := time.Now()
    // 序列化输出结果
    fmt.Printf("当前时间为:%v\n", now)
    // 通过包下提供的函数获取年\月\日\时\分\秒等信息
    year := now.Year()
    month := now.Month()
    day := now.Day()
    hour := now.Hour()
    minute := now.Minute()
    second := now.Second()
    // 序列化输出结果集
    fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)
}
获取时间戳(时间戳是指自1970年1月1日(08:00:00GMT)至当前时间的总毫秒数,它也被称为Unix时间戳(UnixTimestamp)):
package main
import (
    "fmt"
    "time"
)
func main() {
    // 获取当前时间时间戳
    now := time.Now()
    // 时间戳
    timeStamp1 := now.Unix()
    // 纳秒时间戳
    timestamp2 := now.UnixNano()
    // 现在的时间戳
    fmt.Printf("现在的时间戳: %v\n", timeStamp1)
    // 现在的纳秒时间戳
    fmt.Printf("现在的纳秒时间戳: %v\n", timestamp2)
}
获取今天是星期几:
time包中的Weekday函数能够返回某个时间点所对应是一周中的周几:
package main
import (
    "fmt"
    "time"
)
func main() {
    // 获取当前时间
    t := time.Now()
    u := t.Unix()
    // 打印当前时间
    fmt.Println(u)
    // 使用time包提供的函数判断当前时间戳是周几
    fmt.Println(t.Weekday().String())
}
时间操作函数
Add
Sub
Equal
Before
After
Add
求某个时间+时间间隔的函数:
func (t Time) Add(d Duration) Time
/*
返回t + 时间间隔d的值
*/
示例代码:
package main
import (
    "fmt"
    "time"
)
/*
调用time包下的函数求时间的加法
 */
func main() {
    now := time.Now()
    // 调用time包下的add函数求出一小时后的时间
    later := now.Add(time.Hour)
    // 打印结果
    fmt.Println(later)
}
Sub
求两个时间的差值:
/*
返回一个时间段 t - u 的值。如果结果超出了 Duration 可以表示的最大值或最小值,将返回最大值或最小值,要获取时间点 t - d(d 为 Duration),可以使用 t.Add(-d)
*/
func (t Time) Sub(u Time) Duration
示例代码:
package main
import (
"fmt"
"time"
)
func main() {
// 获取当前时间
now := time.Now()
// 调用time包下的sub函数进行时间截取
after := now.Sub(now.Local())
// 打印结果
fmt.Println(after)
}
/*
注意这些函数的返回值类型,因为他们的返回值类型不一定是time对象类型。有些需要将他们的类型进行转化
*/
Equal
判断两个时间是否相同:
/*
会考虑时区的影响,因此不同时区标准的时间也可以正确比较,Equal 方法和用 t==u 不同,Equal 方法还会比较地点和时区信息
*/
func (t Time) Equal(u Time) bool
示例代码:
package main
import (
"fmt"
"time"
)
func main() {
// 获取当前时区时间
t := time.Now()
// 调用equal函数比较时间
bool := t.Equal(time.Now())
fmt.Println(bool)
}
Before
判断一个时间点是否在另一个时间点之前:
/*
t 代表的时间点在 u 之前,则返回真,否则返回假
*/
func (t Time) Before(u Time) bool
After
判断一个时间点是否在另一个时间点之后:
/*
t 代表的时间点在 u 之后,则返回真,否则返回假
*/
func (t Time) After(u Time) bool
定时器
本质:
一个通道(channel)
调用函数:
通过time.Tick函数进行设置
示例代码:
package main
import (
"fmt"
"time"
)
/*
调用时间间隔函数,进行定时器的设置
*/
func main() {
// 声明一个定时器(一秒一次)
ticker := time.Tick(time.Second)
// 循环打印定时器当中的内容
for i := range ticker {
fmt.Println(i)
}
}
时间格式化
时间格式格式化函数Format,使用的是Go语言的诞生时间2006 年 1 月 2 号 15 点 04 分 05 秒作为元时间
示例代码:
package main
import (
"fmt"
"time"
)
func main() {
// 获取当前时间
now := time.Now()
// 格式化的模板为Go的出生时间2006年1月2号15点04分 Mon Jan
// 24h
fmt.Println(now.Format("2006-01-02 15:04:05.000 Mon Jan"))
// 12h
fmt.Println(now.Format("2006-01-02 03:04:05.000 PM Mon Jan"))
fmt.Println(now.Format("2006/01/02 15:04"))
fmt.Println(now.Format("15:04 2006/01/02"))
fmt.Println(now.Format("2006/01/02"))
}
解析字符串格式的时间
解析格式化时间字符串返回它代表的时间:(Parse函数)
func Parse(layout, value string) (Time, error)
ParseInLocation函数
func ParseInLocation(layout, value string, loc *Location) (Time, error)
Parse与ParseInLocation函数的不同之处:
- 
第一,当缺少时区信息时, Parse将时间解释为UTC时间,而ParseInLocation将返回值的Location设置为loc;
- 
第二,当时间字符串提供了时区偏移量信息时, Parse会尝试去匹配本地时区,而ParseInLocation会去匹配loc。
示例代码:
package main
import (
"fmt"
"time"
)
/*
调用time包下的函数解析字符串时间
*/
func main() {
var layout string = "2006-01-02 15:04:05"
var timeStr string = "2019-12-12 15:22:12"
// 调用time包下的函数
timeObject, _ := time.Parse(layout, timeStr)
fmt.Println(timeObject)
// 调用ParseInLocation函数
timeObject2, _ := time.ParseInLocation(layout, timeStr, time.Local) // time.Local直接获取到当前时区的时间
fmt.Println(timeObject2)
}
    It's a lonely road!!!
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号