在Go语言开发中,处理日期时间是高频需求——比如给日志加时间戳、做定时任务、格式化用户看到的时间显示。很多新手觉得“时间处理很复杂”,其实Go的标准库time包已经把常用功能封装得明明白白,不用装任何第三方库,2个核心技巧就能搞定90%的场景。今天用大白话教你:怎么获取当前时间、怎么按需求格式化时间,小白也能直接抄代码用!
一、先搞懂:Go里处理时间的核心——time包
Go语言没有单独的“日期类”或“时间类”,所有日期时间操作都靠标准库的time包实现。它的优势很明显:
- 不用额外安装:属于Go自带的标准库,新建项目直接导入就能用;
- 功能全面:从获取当前时间、格式化显示,到时间计算(比如加一天、算时差)都能搞定;
- 稳定性高:官方维护,不用担心第三方库的兼容性问题。
接下来先从最基础的“获取当前时间”开始,一步步上手。
二、技巧1:获取当前时间——1行代码搞定
想拿到系统当前的日期和时间,只需调用time.Now()函数,再配合fmt包打印就行,超简单。
完整代码示例
新建一个datetime.go文件,粘贴以下代码:
package main
import (
    "fmt"       // 用于打印输出
    "time"      // 核心的时间处理包
)
func main() {
    // 1. 调用time.Now()获取当前时间,赋值给变量dt
    currentTime := time.Now()
    // 2. 打印当前时间(两种方式,选一种就行)
    // 方式1:直接打印,输出完整的时间信息(包括时区、纳秒)
    fmt.Println("当前完整时间:", currentTime)
    // 方式2:用String()方法显式转换为字符串(效果和方式1一样)
    fmt.Println("当前完整时间(String()):", currentTime.String())
}
运行代码并查看结果
在终端进入代码所在目录,执行go run datetime.go,会输出类似这样的结果:
当前完整时间: 2024-05-20 14:30:25.123456789 +0800 CST m=+0.000123456
当前完整时间(String()): 2024-05-20 14:30:25.123456789 +0800 CST
- 结果解读:2024-05-20是日期,14:30:25是时间,123456789是纳秒,+0800 CST表示中国标准时间(时区)。
三、技巧2:格式化时间——按你的需求自定义显示
time.Now()获取的时间是“完整格式”,但实际开发中需要不同的显示方式(比如“2024-05-20”“05-20 14:30”),这时候就需要用Format()方法,按“指定模板”来格式化。
关键:记住Go的“时间模板”
和其他语言(比如Python、Java)不同,Go的时间格式化不用%Y(年)、%m(月)这种占位符,而是用一个固定的“参考时间”作为模板——**Mon Jan 2 15:04:05 MST 2006**。
你没看错,这个时间是固定的!它的含义是:
- Mon:星期缩写(比如Fri);
- Jan:月份缩写(比如May);
- 2:日期(1-31,单数不带前导0);
- 15:24小时制的小时(0-23);
- 04:分钟(0-59);
- 05:秒(0-59);
- MST:时区缩写(比如CST);
- 2006:年份(4位数)。
格式化时,你想显示什么格式,就把这个模板“改成目标格式”。比如想显示“2024-05-20”,就把模板写成2006-01-02(因为2006对应年,01对应月,02对应日)。
常用格式化场景代码示例
还是在datetime.go里,我们扩展一下,实现不同的格式化需求:
package main
import (
    "fmt"
    "time"
)
func main() {
    currentTime := time.Now()
    // 1. 格式1:年-月-日(2024-05-20)
    fmt.Println("年-月-日:", currentTime.Format("2006-01-02"))
    // 2. 格式2:月/日/年(05/20/2024)——适合欧美习惯
    fmt.Println("月/日/年:", currentTime.Format("01/02/2006"))
    // 3. 格式3:年-月-日 时:分:秒(2024-05-20 14:30:45)
    fmt.Println("年-月-日 时:分:秒:", currentTime.Format("2006-01-02 15:04:05"))
    // 4. 格式4:带星期缩写(2024-05-20 14:30:45 Mon)
    fmt.Println("带星期缩写:", currentTime.Format("2006-01-02 15:04:05 Mon"))
    // 5. 格式5:带完整星期(2024-05-20 14:30:45 Monday)
    fmt.Println("带完整星期:", currentTime.Format("2006-01-02 15:04:05 Monday"))
    // 6. 格式6:包含毫秒(2024-05-20 14:30:45.123)
    fmt.Println("带毫秒:", currentTime.Format("2006-01-02 15:04:05.000"))
    // 7. 格式7:包含纳秒(2024-05-20 14:30:45.123456789)
    fmt.Println("带纳秒:", currentTime.Format("2006-01-02 15:04:05.000000000"))
}
运行结果示例
执行go run datetime.go,会输出各种自定义格式的时间:
年-月-日: 2024-05-20
月/日/年: 05/20/2024
年-月-日 时:分:秒: 2024-05-20 14:30:45
带星期缩写: 2024-05-20 14:30:45 Mon
带完整星期: 2024-05-20 14:30:45 Monday
带毫秒: 2024-05-20 14:30:45.123
带纳秒: 2024-05-20 14:30:45.123456789
新手避坑:别搞混“12小时制”和“24小时制”
如果想显示12小时制的时间(比如下午2点显示为02:30,带AM/PM),需要用03表示小时(而不是15),并加上PM(或pm),示例:
// 12小时制带AM/PM(02:30:45 PM)
fmt.Println("12小时制:", currentTime.Format("2006-01-02 03:04:05 PM"))
运行后会输出:12小时制: 2024-05-20 02:30:45 PM。
四、总结:Go时间处理的核心要点
- 获取当前时间:记住time.Now(),1行代码拿到完整时间;
- 格式化时间:核心是“固定模板Mon Jan 2 15:04:05 MST 2006”,想显示什么格式,就把模板对应位置改成目标格式(比如年用2006,月用01,日用02);
- 常用场景:日志时间戳用“2006-01-02 15:04:05”,用户显示用“2006-01-02”,高精度场景(比如性能测试)用“2006-01-02 15:04:05.000000”。
 
 
                     
            
        













 
                    

 
                 
                    