Golang time.Format時(shí)間格式化的實(shí)現(xiàn)
Go 語言的 time.Format 使用一個(gè)固定的參考時(shí)間 Mon Jan 2 15:04:05 MST 2006 來定義格式,這個(gè)時(shí)間是 2006-01-02 15:04:05,對(duì)應(yīng)數(shù)字 1 2 3 4 5 6 7(月份=1,日期=2,小時(shí)=15=3,分鐘=4,秒=5,年份=6,時(shí)區(qū)=7),便于記憶。
一、核心原理
package main
import (
"fmt"
"time"
)
func main() {
t := time.Date(2026, 4, 21, 9, 6, 0, 0, time.Local)
// 使用參考時(shí)間定義格式
fmt.Println(t.Format("2006-01-02 15:04:05")) // 2026-04-21 09:06:00
fmt.Println(t.Format("2006/01/02")) // 2026/04/21
fmt.Println(t.Format("Jan 2, 2006")) // Apr 21, 2026
fmt.Println(t.Format("Monday, January 2, 2006")) // Tuesday, April 21, 2026
}二、常用格式速查
| 格式 | 代碼 | 輸出示例 |
|---|---|---|
| 標(biāo)準(zhǔn)日期時(shí)間 | "2006-01-02 15:04:05" | 2026-04-21 09:06:00 |
| 緊湊日期時(shí)間 | "20060102150405" | 20260421090600 |
| 僅日期 | "2006-01-02" | 2026-04-21 |
| 僅時(shí)間 | "15:04:05" | 09:06:00 |
| 12小時(shí)制 | "2006-01-02 03:04:05 PM" | 2026-04-21 09:06:00 AM |
| RFC3339 | time.RFC3339 | 2026-04-21T09:06:00+08:00 |
| RFC1123 | time.RFC1123 | Tue, 21 Apr 2026 09:06:00 CST |
| 中文格式 | "2006年01月02日 15時(shí)04分05秒" | 2026年04月21日 09時(shí)06分00秒 |
| 日志格式 | "2006/01/02 - 15:04:05.000" | 2026/04/21 - 09:06:00.000 |
三、預(yù)定義常量
time 包內(nèi)置了常用格式常量:
const (
ANSIC = "Mon Jan _2 15:04:05 2006"
UnixDate = "Mon Jan _2 15:04:05 MST 2006"
RubyDate = "Mon Jan 02 15:04:05 -0700 2006"
RFC822 = "02 Jan 06 15:04 MST"
RFC822Z = "02 Jan 06 15:04 -0700"
RFC850 = "Monday, 02-Jan-06 15:04:05 MST"
RFC1123 = "Mon, 02 Jan 2006 15:04:05 MST"
RFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700"
RFC3339 = "2006-01-02T15:04:05Z07:00"
RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
Kitchen = "3:04PM"
Stamp = "Jan _2 15:04:05"
StampMilli = "Jan _2 15:04:05.000"
StampMicro = "Jan _2 15:04:05.000000"
StampNano = "Jan _2 15:04:05.000000000"
)使用示例:
t := time.Now() fmt.Println(t.Format(time.RFC3339)) // 2026-04-21T09:06:00+08:00 fmt.Println(t.Format(time.Kitchen)) // 9:06AM
四、解析時(shí)間(Parse)
time.Parse 使用相同的參考時(shí)間格式:
// 解析字符串為 time.Time
t, err := time.Parse("2006-01-02 15:04:05", "2026-04-21 09:06:00")
if err != nil {
log.Fatal(err)
}
// 帶時(shí)區(qū)解析
t, err = time.ParseInLocation("2006-01-02 15:04:05", "2026-04-21 09:06:00", time.Local)五、常見坑
1. 月份大小寫
"01" // 月份數(shù)字 (01-12) "1" // 月份數(shù)字 (1-12,無前導(dǎo)零) "Jan" // 英文縮寫 (Jan, Feb...) "January" // 英文全名
2. 日期大小寫
"02" // 日期 (01-31) "2" // 日期 (1-31) "_2" // 日期 ( 1-31,空格補(bǔ)齊)
3. 小時(shí)制
"15" // 24小時(shí)制 (00-23) "03" // 12小時(shí)制 (01-12) "3" // 12小時(shí)制 (1-12) "PM" // 大寫 AM/PM "pm" // 小寫 am/pm
4. 時(shí)區(qū)
"MST" // 時(shí)區(qū)縮寫 (CST, PST...) "-0700" // 數(shù)字時(shí)區(qū)偏移 "-07:00" // 帶冒號(hào)的時(shí)區(qū)偏移 "Z0700" // RFC3339 格式時(shí)區(qū) "Z07:00" // RFC3339 帶冒號(hào)
六、實(shí)用工具函數(shù)
package main
import (
"fmt"
"time"
)
// 常用格式常量
const (
FormatDateTime = "2006-01-02 15:04:05"
FormatDate = "2006-01-02"
FormatTime = "15:04:05"
FormatCompact = "20060102150405"
)
// FormatTime 格式化時(shí)間
func FormatTime(t time.Time) string {
return t.Format(FormatDateTime)
}
// ParseTime 解析時(shí)間字符串
func ParseTime(s string) (time.Time, error) {
return time.ParseInLocation(FormatDateTime, s, time.Local)
}
// BeginOfDay 獲取當(dāng)天開始時(shí)間
func BeginOfDay(t time.Time) time.Time {
return time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location())
}
// EndOfDay 獲取當(dāng)天結(jié)束時(shí)間
func EndOfDay(t time.Time) time.Time {
return time.Date(t.Year(), t.Month(), t.Day(), 23, 59, 59, 999999999, t.Location())
}
func main() {
now := time.Now()
fmt.Println("當(dāng)前時(shí)間:", FormatTime(now))
fmt.Println("當(dāng)天開始:", BeginOfDay(now).Format(FormatDateTime))
fmt.Println("當(dāng)天結(jié)束:", EndOfDay(now).Format(FormatDateTime))
t, _ := ParseTime("2026-04-21 09:06:00")
fmt.Println("解析結(jié)果:", t.Format(FormatDateTime))
}七、記憶口訣
月份 1,日期 2,小時(shí) 3(15點(diǎn)),分鐘 4,秒 5,年份 6,時(shí)區(qū) 7
2006-01-02 15:04:05
↑ ↑ ↑ ↑ ↑
6 1 3 4 5記住這個(gè)參考時(shí)間,所有格式都基于此推導(dǎo)即可。
到此這篇關(guān)于Golang time.Format時(shí)間格式化的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Golang time.Format時(shí)間格式化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go語言實(shí)現(xiàn)聊天服務(wù)器的示例代碼
這篇文章主要介紹了go語言實(shí)現(xiàn)聊天服務(wù)器的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08
Go利用反射reflect實(shí)現(xiàn)獲取接口變量信息
反射是通過實(shí)體對(duì)象獲取反射對(duì)象(Value、Type),然后可以操作相應(yīng)的方法。本文將利用Go語言中的反射reflect實(shí)現(xiàn)獲取接口變量信息,需要的可以參考一下2022-05-05
Go處理json數(shù)據(jù)方法詳解(Marshal,UnMarshal)
這篇文章主要介紹了Go處理json數(shù)據(jù)的方法詳解,Marshal(),UnMarshal(),需要的朋友可以參考下2022-04-04
Golang 協(xié)程配合管道的實(shí)現(xiàn)示例
本文主要介紹了Golang協(xié)程配合管道的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01

