【学习笔记】Go语言time包和日期处理详解

159 阅读3分钟

Go语言time包和日期处理详解

摘要: 本文详细介绍了Go语言time包的常用功能,包括:获取当前时间及其属性,使用自定义格式格式化时间,处理秒级和纳秒级时间戳,以及通过Ticker或Sleep实现定时任务。内容简明实用,适合初学者快速掌握(由ChatGPT生成)

获取当前时间

在Go语言中,我们可以通过time.Now()获取当前的时间

package main
import (
	"fmt"
	"time"
)
func main() {
	timeObj := time.Now()
	fmt.Printf("%v - %T", timeObj, timeObj)
}
// 2024-11-23 20:29:04.3549912 +0800 CST m=+0.000000001 - time.Time

通过上面的打印可以看出来,timeObj是一个time.Time对象,所以我们可以通过.的方式来获取其中的一些属性。

package main
import (
	"fmt"
	"time"
)
func main() {
	timeObj := time.Now()
	// 获取年份
	year := timeObj.Year()
	// 获取月份
	month := timeObj.Month()
	// 获取天数
	day := timeObj.Day()
	// 获取小时
	hour := timeObj.Hour()
	// 获取分钟
	minute := timeObj.Minute()
	// 获取秒钟
	second := timeObj.Second()
	// 这里的02d作用: 当时间只有一位数时,在前面补充0,让它变成两位数
	// 例如 2024年11月23日 10:5:3   => 2024年11月23日 10:05:03
	fmt.Printf("%d年%02d月%02d日 %02d:%02d:%02d\n", year, month, day, hour, minute, second)
}
// 2024年11月23日 20:31:51

通过Format格式化时间

Go语言与其他语言不同的,格式化时间用的并不是Y-m-d H:M:S,而是2006-01-02 15:04:05这个也是GO语言的诞生时间。

package main
import (
	"fmt"
	"time"
)
func main() {
	timeObj := time.Now()
	// 2006 01 02 15 04 05 这个是格式化的标准, 分别用来格式化 年 月 日 时 分 秒
	// 03 表示 12小时制
	// 15 表示 24小时制
	fmt.Println(timeObj.Format("2006年01月02 15:04:05"))
	fmt.Println(timeObj.Format("2006年01月02日 03:04:05"))
	fmt.Println(timeObj.Format("2006-01-02 15:04:05"))
	fmt.Println(timeObj.Format("01-02 03:04:05"))
}
/*
2024年11月23 20:39:29
2024年11月23日 08:39:29
2024-11-23 20:39:29
11-23 08:39:29
 */

时间戳

时间戳是自1970年1月1日(08:00:00GMT)至当前时间的总毫秒数。它也被称为Unix时间戳(UnixTimestamp)

3.1 获取当前时间的时间戳
package main
import (
	"fmt"
	"time"
)
func main() {
	timeObj := time.Now()
	fmt.Println(timeObj.Format("2006年01月02 15:04:05"))
	fmt.Println(timeObj.Unix())     // 获取当前时间的毫秒级时间戳
	fmt.Println(timeObj.UnixNano()) // 获取当前时间的纳秒级时间戳
}
/*
2024年11月23 20:44:00
1732365840
1732365840140772400
 */
3.2 将毫米级时间戳转为时间字符串
package main
import (
	"fmt"
	"time"
)
func unixToTime(timestamp int64) string {
	// 如果要转换的是纳秒级时间,则格式为time.Unix(0, timestamp)
	timeObj := time.Unix(timestamp, 0) // 将毫米级时间戳转为Time对象
	str := timeObj.Format("2006年01月02 15:04:05")
	return str
}
func main() {
	timestamp := 1732365840
	fmt.Println("timestamp:", timestamp)
	fmt.Println("当前时间:", unixToTime(int64(timestamp)))
}
/*
timestamp: 1732365840
当前时间: 2024年11月23 20:44:00
*/

定时器

4.1 使用NewTicker
package main
import (
	"fmt"
	"time"
)
func main() {
	ticker := time.NewTicker(time.Second * 10) // 间隔为10秒
	for t := range ticker.C {
		// 无限死循环,每隔十秒打印一次
		fmt.Println("Tick at", t)
	}
}
/*
Tick at 2024-11-23 21:12:24.9378224 +0800 CST m=+10.000000001
Tick at 2024-11-23 21:12:34.9378224 +0800 CST m=+20.000000001
....
*/
4.2 通过Sleep实现
package main

import (
	"fmt"
	"time"
)
func main() {
	for {
		fmt.Println("当前时间:", time.Now().Format("2006年01月02 15:04:05"))
		time.Sleep(10 * time.Second)
	}
}
/*
当前时间: 2024年11月23 21:14:45
当前时间: 2024年11月23 21:14:55
*/