凡是项目都少不了针对日期进行各种处理,一门优秀的语言也自然少不了处理日期的函数
随着项目越来越大,数据量越来越大,多数情况下我们都需要使用日期对数据进行记录,使用日期对数据进行过滤(年、月、日、时、分、秒级别的过滤都有可能会遇到)
golang 提供的对于时间和日期进行各种处理的功能,用来满足项目上根据时间和日期进行操作的需求。
引入时间库,time
import time
代码如下(示例):
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
代码如下(示例):
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
使用 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
使用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
以下常量可以直接使用,使用方法: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,
golang 中有两种时间戳,分别是 Unix(秒)、UnixNanno(纳秒)
需要注意的是:这两个都是从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中文文档