2.19 Go之time包:时间和日期

2.19 Go之time包:时间和日期

time包简介

  • 时间值

  • 时区

这一点在Go语言的time包源码当中可以看出

正确表示时间

国内使用的北京时间与UTC时间的关系:

UTC + 8个小时 = 北京时间

Gotime包下的时区变量:

  • time.UTCUTC时间

  • 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)

ParseParseInLocation函数的不同之处:

  • 第一,当缺少时区信息时,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)
}

 

posted @   俊king  阅读(372)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示