凡是项目都少不了针对日期进行各种处理,一门优秀的语言也自然少不了处理日期的函数


前言

随着项目越来越大,数据量越来越大,多数情况下我们都需要使用日期对数据进行记录,使用日期对数据进行过滤(年、月、日、时、分、秒级别的过滤都有可能会遇到)


一、什么是时间和日期处理函数

golang 提供的对于时间和日期进行各种处理的功能,用来满足项目上根据时间和日期进行操作的需求。

二、常见函数

1、引入库

import time

2、获取当前时间

代码如下(示例):

now := time.Now()
fmt.Printf("now的类型是:%T, 值为:%v\n", now, now)

输出结果:

 now的类型是:time.Time, 值为:2022-11-11 11:27:06.2755304 +0800 CST m=+0.003895001

3、获取年、月、日、时、分、秒

代码如下(示例):

now := time.Now()
fmt.Printf("now的类型是:%T, 值为:%v\n", now, now)
year := now.Year()
month := now.Month()
monthInt := int(month)
day := now.Day()
hour := now.Hour()
minute := now.Minute()
sec := now.Second()
fmt.Printf("year的类型是:%T,值为:%v\n", year, year)
fmt.Printf("month的类型是:%T,值为:%v\n", month, month)
fmt.Printf("monthInt的类型是:%T,值为:%v\n", monthInt, monthInt)
fmt.Printf("day的类型是:%T,值为:%v\n", day, day)
fmt.Printf("hour的类型是:%T,值为:%v\n", hour, hour)
fmt.Printf("minute的类型是:%T,值为:%v\n", minute, minute)
fmt.Printf("sec的类型是:%T,值为:%v\n", sec, sec)
需要注意的是用now.Month()获取到的月份不是整数类型,而是time.Month,返回的是英文,如果想要得到整数类型,强转一下就可以了

输出结果:

now的类型是:time.Time, 值为:2022-11-11 11:40:20.5595895 +0800 CST m=+0.003299201
year的类型是:int,值为:2022            
month的类型是:time.Month,值为:November
monthInt的类型是:int,值为:11          
day的类型是:int,值为:11               
hour的类型是:int,值为:11              
minute的类型是:int,值为:40            
sec的类型是:int,值为:20

4、格式化日期时间的第一种方法

使用 fmt.Printf() 直接打印,或者使用fmt.Sprintf()拿到格式化后的字符串
now := time.Now()
fmt.Printf("now的类型是:%T, 值为:%v\n", now, now)
year := now.Year()
month := now.Month()
monthInt := int(month)
day := now.Day()
hour := now.Hour()
minute := now.Minute()
sec := now.Second()
fmt.Printf("当前时间是:%d-%d-%d %d:%d:%d \n", year,
	monthInt, day, hour, minute, sec)
nowStr := fmt.Sprintf("%d-%d-%d %d:%d:%d", year,
	monthInt, day, hour, minute, sec)
fmt.Printf("nowStr的类型是:%T, 值为:%v\n", nowStr, nowStr)

输出的结果:

now的类型是:time.Time, 值为:2022-11-11 11:56:18.4902295 +0800 CST m=+0.002711501
当前时间是:2022-11-11 11:56:18                   
nowStr的类型是:string, 值为:2022-11-11 11:56:18

5、格式化日期时间的第二种方法

使用Format("2006-01-02 15:04:05")方法,其中的“2006-01-02 15:04:05”是固定的,不能换成其它时间 
now := time.Now()
dateStr := now.Format("2006-01-02 15:04:05")
fmt.Printf("dateStr的类型是:%T,值为:%v\n", dateStr, dateStr)

输出的结果:

dateStr的类型是:string,值为:2022-11-11 12:07:14

6、时间常量

以下常量可以直接使用,使用方法:time.Second, 或 100 * time.Millisecond, 但是不能进行相除:time.Second / 10 ,这个写法是错误的,golang里只认整数
const (
	Nanosecond  Duration = 1
	Microsecond          = 1000 * Nanosecond
	Millisecond          = 1000 * Microsecond
	Second               = 1000 * Millisecond
	Minute               = 60 * Second
	Hour                 = 60 * Minute
)

应用场景(示例1):

// 每隔1秒输出一个数字,到10时退出
i := 0
for {
	i++
	fmt.Println(i)
	time.Sleep(time.Second)
	if 10 == i {
		break
	}
}

输出结果:

1
2
3
4
5
6
7
8
9
10

应用场景(示例2)

// 每隔0.1秒输出一个数字,到100时退出
i := 0
for {
	i++
	fmt.Print(i, ",")
	// 这里只能这么写,不能写成 time.Second * 0.1
	// 原因是time.Sleep()里只接收整数
	time.Sleep(time.Millisecond * 100)
	if 100 == i {
		break
	}
}

输出结果:

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,
59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,

7、时间戳

需要注意的是:这两个都是从1970年1月1日0点0分0秒0纳秒到现在所经过的时间

代码如下(示例):

now := time.Now()
secTs := now.Unix()
nanoTs := now.UnixNano()
fmt.Printf("secTs的类型是: %T,值为:%v\n", secTs, secTs)
fmt.Printf("nanoTs的类型是: %T,值为:%v\n", nanoTs, nanoTs)

输出结果:

secTs的类型是: int64,值为:1668147948
nanoTs的类型是: int64,值为:1668147948471999800

总结

以上就是这次要分享的常用的时间函数,本文仅仅简单介绍了使用频率比较高的时间函数,如果还不能满足大家的需求,大家可以自行研究 golang中文文档