文章來源:http://gf.johng.cn/494387
通用時間管理模組,封裝了常用的時間/日期相關的方法。並支援自訂的日期格式化文法,格式化文法類似PHP的date文法。
使用方式:
import "gitee.com/johng/gf/g/os/gtime"
方法列表: godoc.org/github.com/johng-cn/gf/g/os/gtime
時間格式
gtime
模組最大的特點是支援自訂的時間格式,參考PHP日期時間格式文法,以下是支援的時間格式文法列表:
時間對象
方法列表:
type Time func New(t ...time.Time) *Time func NewFromStr(str string) *Time func NewFromStrFormat(str string, format string) *Time func NewFromStrLayout(str string, layout string) *Time func NewFromTime(t time.Time) *Time func NewFromTimeStamp(timestamp int64) *Time func Now() *Time func (t *Time) Add(d time.Duration) *Time func (t *Time) AddDate(years int, months int, days int) *Time func (t *Time) Clone() *Time func (t *Time) Format(format string) string func (t *Time) Layout(layout string) string func (t *Time) Local() *Time func (t *Time) Microsecond() int64 func (t *Time) Millisecond() int64 func (t *Time) Nanosecond() int64 func (t *Time) Round(d time.Duration) *Time func (t *Time) Second() int64 func (t *Time) String() string func (t *Time) ToLocation(location *time.Location) *Time func (t *Time) ToTime() time.Time func (t *Time) Truncate(d time.Duration) *Time func (t *Time) UTC() *Time
建立gtime.Time
對象可以通過標準庫time.Time
對象、Unix時間戳記、時間字串(如:2018-07-18 12:01:00)、自訂時間字串(需要給定格式,支援自訂格式及標準庫格式)。
樣本1,自訂時間格式化文法
package mainimport ( "fmt" "gitee.com/johng/gf/g/os/gtime")func main() { formats := []string{ "Y-m-d H:i:s.u", "D M d H:i:s T O Y", "\\T\\i\\m\\e \\i\\s: h:i:s a", "2006-01-02T15:04:05.000000000Z07:00", } t := gtime.Now() for _, f := range formats { fmt.Println(t.Format(f)) }}
在該樣本中,我們給定了四種format格式,並將目前時間用這四種格式轉換後列印出來。執行後,輸出結果如下:
2018-07-22 11:17:13.797Sun Jul 22 11:17:13 CST +0800 2018Time is: 11:17:13 am2006-01-02CST15:04:05.000000000Z07:00
可以看到,這個樣本示範了幾個需要注意的地方:
- 如果使用的字母與格式化字元衝突時,可以使用
\
符號轉移該字元,這樣時間格式解析器會認為該字元不是格式化字元,而是普通字母。因此這裡的第三個字串樣本輸出為:Time is: 11:17:13 am
- 使用
Format
方法接收的是自訂的時間格式化文法(如:Y-m-d H:i:s
),而不是標準庫的事件格式文法(如:2006-01-02 15:04:05
),且兩種文法不能混用,因此在這裡的第四個字串樣本中原樣輸出參數值;
樣本2,標準庫時間格式化文法
package mainimport ( "fmt" "gitee.com/johng/gf/g/os/gtime")func main() { formats := []string{ "2006-01-02 15:04:05.000", "Mon Jan _2 15:04:05 MST 2006", "Time is: 03:04:05 PM", "2006-01-02T15:04:05.000000000Z07:00 MST", } t := gtime.Now() for _, f := range formats { fmt.Println(t.Layout(f)) }}
在該樣本中,我們使用四種標準庫的時間格式化文法格式化當前的時間並輸出結果到終端。執行後,輸出結果為:
2018-07-22 11:28:13.945Sun Jul 22 11:28:13 CST 2018Time is: 11:28:13 AM2018-07-22T11:28:13.945153275+08:00 CST
根絕這個樣本,也有幾個需要說明的地方:
- 自訂時間格式化文法與標準庫時間格式化文法並不衝突,前者使用
Format
方法,後者使用Layout
文法進行格式化,相互獨立,互不衝突,無法混用;
- 標準庫的時間格式化文法自有特點,是不是感覺有點複雜;
樣本3,時間對象鏈式操作
package mainimport ( "fmt" "gitee.com/johng/gf/g/os/gtime" "time")func main() { // 去年今日 fmt.Println(gtime.Now().AddDate(-1, 0, 0).Format("Y-m-d")) // 去年今日,UTC時間 fmt.Println(gtime.Now().AddDate(-1, 0, 0).Format("Y-m-d H:i:s T")) fmt.Println(gtime.Now().AddDate(-1, 0, 0).UTC().Format("Y-m-d H:i:s T")) // 下個月1號淩晨0點整 fmt.Println(gtime.Now().AddDate(0, 1, 0).Format("Y-m-d 00:00:00")) // 2個小時前 fmt.Println(gtime.Now().Add(-time.Hour).Format("Y-m-d H:i:s"))}
執行後,輸出結果為:
2017-07-222017-07-22 11:42:36 CST2017-07-22 03:42:36 UTC2018-08-22 00:00:002018-07-22 10:42:36
該樣本比較簡單,便不多贅述。
工具方法
godoc.org/github.com/johng-cn/gf/g/os/gtime
func Date() stringfunc Datetime() stringfunc Microsecond() int64func Millisecond() int64func Nanosecond() int64func Second() int64func SetInterval(t time.Duration, callback func() bool)func SetTimeZone(zone string) errorfunc SetTimeout(t time.Duration, callback func())func StrToTime(str string) (time.Time, error)func StrToTimeFormat(str string, format string) (time.Time, error)func StrToTimeLayout(str string, layout string) (time.Time, error)
方法比較簡單,比較常用的是以下幾個方法;
Second
用於獲得目前時間戳,Millisecond
、Microsecond
及Nanosecond
用於獲得當前的毫秒、微秒和納秒值;
Date
和Datetime
用於獲得當前日期及當前日期時間;
SetTimeZone
用於設定當前進程的全域時區;
- 其他方法說明請查看介面文檔;
簡單樣本:
package mainimport ( "fmt" "gitee.com/johng/gf/g/os/gtime")func main() { fmt.Println("Date :", gtime.Date()) fmt.Println("Datetime :", gtime.Datetime()) fmt.Println("Second :", gtime.Second()) fmt.Println("Millisecond:", gtime.Millisecond()) fmt.Println("Microsecond:", gtime.Microsecond()) fmt.Println("Nanosecond :", gtime.Nanosecond())}
執行後,輸出結果為:
Date : 2018-07-22Datetime : 2018-07-22 11:52:22Second : 1532231542Millisecond: 1532231542688Microsecond: 1532231542688688Nanosecond : 1532231542688690259