[Go关于时间] time库/扩展now库

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Go关于时间] time库/扩展now库相关的知识,希望对你有一定的参考价值。

参考自liwenzhou

文章目录

Time库

Time对象

Go语言中使用time.Time类表示时间

可以由这个对象获取到年、月、日、时、分、秒等信息

func timeDemo() 
	now := time.Now() // 获取当前时间
	fmt.Printf("current time:%v\\n", now)

	year := now.Year()     // 年
	month := now.Month()   // 月
	day := now.Day()       // 日
	hour := now.Hour()     // 小时
	minute := now.Minute() // 分钟
	second := now.Second() // 秒
	fmt.Println(year, month, day, hour, minute, second)

时区概念

除了上面直接用time.Now()获取当前时间,也可以自己创建时间

func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time

最后一个参数是时区,表示的是不同地区的时间定义(因为有时差的概念)

创建时区也有一个函数,其中name为时区名字,offset为时差的偏移量

func FixedZone(name string, offset int) *Location

一个小例子

func timeDemo() 
	secondsEastOfUTC := int((8 * time.Hour).Seconds())
	// FixedZone 返回始终使用给定区域名称和偏移量(UTC 以东秒)的 Location。
	beijing := time.FixedZone("Beijing Time", secondsEastOfUTC)
	newYork, err := time.LoadLocation("America/New_York") // UTC-05:00

	if err != nil 
		fmt.Println("load America/New_York location failed", err)
		return
	

	timeInUTC := time.Date(2009, 1, 1, 12, 0, 0, 0, time.UTC)
	sameTimeInBeijing := time.Date(2009, 1, 1, 20, 0, 0, 0, beijing)
	sameTimeInNewYork := time.Date(2009, 1, 1, 7, 0, 0, 0, newYork)

	// 北京时间(东八区)比UTC早8小时,所以上面两个时间看似差了8小时,但表示的是同一个时间
	timesAreEqual := timeInUTC.Equal(sameTimeInBeijing)
	fmt.Println(timesAreEqual)

	// 纽约(西五区)比UTC晚5小时,所以上面两个时间看似差了5小时,但表示的是同一个时间
	timesAreEqual = timeInUTC.Equal(sameTimeInNewYork)
	fmt.Println(timesAreEqual)

Unix Time

Unix Time是自1970年1月1日 00:00:00 UTC 至当前时间经过的总秒数。

下面的代码片段演示了如何基于时间对象获取到Unix 时间。

func timeDemo() 
	now := time.Now()        // 获取当前时间
	timestamp := now.Unix()  // 秒级时间戳
	fmt.Println(timestamp)

反过来将int64的时间戳转化为时间对象

func timeDemo() 
	sec  := time.Now().Unix()
	// 将秒级时间戳转为时间对象(第二个参数为不足1秒的纳秒数)
	timeObj := time.Unix(sec, 22)
	fmt.Println(timeObj)           

时间间隔,加减法

关于时间的运算都是以time.Duration类型(纳秒)为最小单位的

一下是time库中的常量定义

const (
	Nanosecond  Duration = 1
	Microsecond          = 1000 * Nanosecond
	Millisecond          = 1000 * Microsecond
	Second               = 1000 * Millisecond
	Minute               = 60 * Second
	Hour                 = 60 * Minute
)

Add方法

func (t Time) Add(d Duration) Time
func timeDemo() 
	now := time.Now()
	fmt.Println( now )
	var MyHour time.Duration = 1000*1000*1000*60*60;  //纳秒转小时
	later := now.Add( MyHour ) // 当前时间加1小时后的时间
	fmt.Println(later)

Sub方法

求两个时间的差值

func (t Time) Sub(u Time) Duration
func timeDemo() 
	sub := time.Now()
	var MyHour time.Duration = 1000*1000*1000*60*60;
	subed := sub.Add( MyHour )
	fmt.Println( sub,subed )
	fmt.Println( "差值为 = ",sub.Sub(subed) )

其他的一些函数

func (t Time) Equal(u Time) bool  //比较时间是否相同,会考虑时区的影响
func (t Time) Before(u Time) bool //若t时间在u前面返回真,否则假
func (t Time) After(u Time) bool //和上面相反

定时器

本质上是一个time类型的chan信道,每到设定的间隔就会发送一个当前时间进来

func timeDemo() 
	ticker := time.Tick(time.Second) //定义一个1秒间隔的定时器
	for i := range ticker 
		fmt.Println(i)//每秒都会执行的任务
	

格式化时间

有时候需要不同格式的时间输出,就可以使用Format这个函数

参数是需要设置的格式,格式化的模板必须是2006-01-02 15:04:05

当然什么格式可以自行调整

func timeDemo() 
	now := time.Now()
	// 格式化的模板为 2006-01-02 15:04:05 简单记忆为2006 1 2 3 4 5
	// 24小时制
	fmt.Println(now.Format("2006-01-02 15:04:05.000 Mon Jan"))
	// 12小时制
	fmt.Println(now.Format("2006-01-02 03:04:05.000 PM Mon Jan")) //pm表示下午
	// 小数点后写0,因为有3个0所以格式化输出的结果也保留3位小数
	fmt.Println(now.Format("2006/01/02 15:04:05.000")) // 2022/02/27 00:10:42.960
	// 小数点后写9,会省略末尾可能出现的0
	fmt.Println(now.Format("2006/01/02 15:04:05.999")) // 2022/02/27 00:10:42.96
	// 只格式化时分秒部分
	fmt.Println(now.Format("15:04:05"))
	// 只格式化日期部分
	fmt.Println(now.Format("2006.01.02"))

从字符串中解析时间

实际上就是上面的反过程,使用time.Parse函数完成

func timeDemo() 
	// 在没有时区指示符的情况下,time.Parse 返回UTC时间
	timeObj, err := time.Parse("2006-01-02 15:04:05.000", "2022-03-24 16:01:09.560")
	if err != nil 
		fmt.Println(err)
		return
	
	fmt.Println(timeObj) // 2022-10-05 11:25:20 +0000 UTC

	// 在有时区指示符的情况下,time.Parse 返回对应时区的时间表示
	// RFC3339     = "2006-01-02T15:04:05Z07:00"
	timeObj, err = time.Parse(time.RFC3339, "2022-10-05T11:25:20+08:00")
	if err != nil 
		fmt.Println(err)
		return
	
	fmt.Println(timeObj) // 2022-10-05 11:25:20 +0800 CST

jinzhu/now库

github地址

也是用来处理时间的一个组件

优化time.Parse

time库中解析字符串2022-03-24和字符串2022/03/24需要两种不同的模板

而使用now可以简化这个过程, 非常方便,自动识别格式

func timeDemo() 
	t, _ := now.Parse("2017/01/02")
	fmt.Println(t)
	t2, _ := now.Parse("2017-10-02 17:30")
	fmt.Println(t2)

以上是关于[Go关于时间] time库/扩展now库的主要内容,如果未能解决你的问题,请参考以下文章

[Go关于时间] time库/扩展now库

Go语言标准库之time

Go语言标准库之time

go语言标准库之time

13.Go语言标准库之time包

Go 开源库运行时依赖注入框架 Dependency injection