Go 標(biāo)準(zhǔn)庫介紹二: time

原文鏈接 http://ironxu.com/747

介紹Go 標(biāo)準(zhǔn)庫 time 常用導(dǎo)出函數(shù)忌愚,結(jié)構(gòu)體及其方法曲管。

import "time"

time包提供顯示和計算時間用的函數(shù)。

1. 時間處理類型

Go 中時間處理依賴的數(shù)據(jù)類型: time.Time, time.Month, time.Weekday, time.Duration, time.Location硕糊。

1.1 time.Time 時間點

time.Time 代表一個納秒精度的時間點.

/usr/local/go/src/time/time.go 定義如下:

type Time struct {
    sec int64 // 從1年1月1日 00:00:00 UTC 至今過去的秒數(shù)
    nsec int32 // 最近一秒到下一秒過去的納秒數(shù)
    loc *Location // 時區(qū)
}

時間變量標(biāo)識一個具體的時間點院水,演示如下:

var t time.Time // 定義 time.Time 類型變量
t = time.Now()  // 獲取當(dāng)前時間
fmt.Printf("時間: %v, 時區(qū):  %v,  時間類型: %T\n", t, t.Location(), t)
// 時間: 2017-02-22 09:06:05.816187261 +0800 CST, 時區(qū):  Local,  時間類型: time.Time

// time.UTC() time 返回UTC 時區(qū)的時間
fmt.Printf("時間: %v, 時區(qū):  %v,  時間類型: %T\n", t.UTC(), t.UTC().Location(), t)
// 時間: 2017-02-22 01:07:15.179280004 +0000 UTC, 時區(qū):  UTC,  時間類型: time.Time

代碼中應(yīng)使用time.Time 類型值來保存和傳遞時間,而不能用指針简十。表示時間的變量和字段檬某,應(yīng)為time.Time類型,而不是*time.Time類型螟蝙。

每一個時間點都具有時區(qū)信息恢恼,當(dāng)計算時間的表示格式時,如Format胰默、HourYear等方法场斑,都會考慮該信息。Local牵署、UTCIn方法返回一個指定時區(qū)(但指向同一時間點)的Time漏隐。修改時區(qū)信息只是會改變其表示,不會修改被表示的時間點奴迅。

1.2 time.Month 月份

time.Month 代表一年中的某個月

/usr/local/go/src/time/time.go 定義如下:

type Month int

和月份相關(guān)的常量如下:

const (
    January Month = 1 + iota
    February
    March
    April
    May
    June
    July
    August
    September
    October
    November
    December
)

1.3 time.Weekday 星期

time.Weekday 代表一周的周幾青责。

/usr/local/go/src/time/time.go 定義如下:

type Weekday int

和星期相關(guān)的常量:

const (
    Sunday Weekday = iota
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
)

1.4 time.Duration 時間段

time.Duration 類型代表兩個時間點之間經(jīng)過的納秒數(shù),可表示的最長時間段約為290年。

/usr/local/go/src/time/time.go 定義如下:

type Duration int64

涉及常量如下:

const (
    Nanosecond  Duration = 1
    Microsecond          = 1000 * Nanosecond
    Millisecond          = 1000 * Microsecond
    Second               = 1000 * Millisecond
    Minute               = 60 * Second
    Hour                 = 60 * Minute
)

1.5 time.Location 時區(qū)

Location代表一個地點爽柒,以及該地點所在的時區(qū)信息吴菠。北京時間可以使用 Asia/Shanghai

/usr/local/go/src/time/zoneinfo.go 中定義:

type Location struct {
    name string
    zone []zone
    tx   []zoneTrans
    cacheStart int64
    cacheEnd   int64
    cacheZone  *zone
}

預(yù)定義時區(qū)變量:

var UTC *Location = &utcLoc
var Local *Location = &localLoc

2. time.Time 方法

介紹 time.Time 接受者的方法:獲取時間點,獲取時間相關(guān)信息浩村,時間比較做葵,計算和序列化操作。

示例代碼文件: $GOPATH/src/github.com/ironxu/go_note/library/time/time.go

2.1 獲取一個時間的方法

  • func Now() Time {} // 當(dāng)前本地時間
  • func Unix(sec int64, nsec int64) Time {} // 根據(jù)時間戳返回本地時間
  • func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time {} // 返回指定時間
// 當(dāng)前本地時間
t = time.Now()
fmt.Println("'time.Now': ", t)

// 根據(jù)時間戳返回本地時間
t_by_unix := time.Unix(1487780010, 0)
fmt.Println("'time.Unix': ", t_by_unix)

// 返回指定時間
t_by_date := time.Date(2017, time.Month(2), 23, 1, 30, 30, 0, l)
fmt.Println("'time.Date': ", t_by_date)

2.2 時間顯示

  • func (t Time) UTC() Time {} // 獲取指定時間在UTC 時區(qū)的時間表示
  • func (t Time) Local() Time {} // 以本地時區(qū)表示
  • func (t Time) In(loc *Location) Time {} // 時間在指定時區(qū)的表示
  • func (t Time) Format(layout string) string {} // 按指定格式顯示時間
// 獲取指定時間在UTC 時區(qū)的時間表示
t_by_utc := t.UTC()
fmt.Println("'t.UTC': ", t_by_utc)

// 獲取本地時間表示
t_by_local := t.Local()
fmt.Println("'t.Local': ", t_by_local)

// 時間在指定時區(qū)的表示
t_in := t.In(time.UTC)
fmt.Println("'t.In': ", t_in)

// Format
fmt.Println("t.Format", t.Format(time.RFC3339))

2.3 獲取日期信息

  • func (t Time) Date() (year int, month Month, day int) {} // 返回時間的日期信息
  • func (t Time) Year() int {} // 返回年
  • func (t Time) Month() Month {} // 月
  • func (t Time) Day() int {} // 日
  • func (t Time) Weekday() Weekday {} // 星期
  • func (t Time) ISOWeek() (year, week int) {} // 返回年心墅,星期范圍編號
  • func (t Time) Clock() (hour, min, sec int) {} // 返回時間的時分秒
  • func (t Time) Hour() int {} // 返回小時
  • func (t Time) Minute() int {} // 分鐘
  • func (t Time) Second() int {} // 秒
  • func (t Time) Nanosecond() int {} // 納秒
  • func (t Time) YearDay() int {} // 一年中對應(yīng)的天
  • func (t Time) Location() *Location {} // 時間的時區(qū)
  • func (t Time) Zone() (name string, offset int) {} // 時間所在時區(qū)的規(guī)范名和想對UTC 時間偏移量
  • func (t Time) Unix() int64 {} // 時間轉(zhuǎn)為時間戳
  • func (t Time) UnixNano() int64 {} // 時間轉(zhuǎn)為時間戳(納秒)
// 返回時間的日期信息
year, month, day := t.Date()
fmt.Println("'t.Date': ", year, month, day)

// 星期
week := t.Weekday()
fmt.Println("'t.Weekday': ", week)

// 返回年酿矢,星期范圍編號
year, week_int := t.ISOWeek()
fmt.Println("'t.ISOWeek': ", year, week_int)

// 返回時間的時分秒
hour, min, sec := t.Clock()
fmt.Println("'t.Clock': ", hour, min, sec)

2.4 時間比較與計算

  • func (t Time) IsZero() bool {} // 是否是零時時間
  • func (t Time) After(u Time) bool {} // 時間在u 之前
  • func (t Time) Before(u Time) bool {} // 時間在u 之后
  • func (t Time) Equal(u Time) bool {} // 時間與u 相同
  • func (t Time) Add(d Duration) Time {} // 返回t +d 的時間點
  • func (t Time) Sub(u Time) Duration {} // 返回 t-u
  • func (t Time) AddDate(years int, months int, days int) Time {} 返回增加了給出的年份、月份和天數(shù)的時間點Time
// 返回增加了給出的年份怎燥、月份和天數(shù)的時間點Time
t_new := t.AddDate(0, 1, 1)
fmt.Println("'t.AddDate': ", t_new)

// 時間在u 之前
is_after := t.After(t_new)
fmt.Println("'t.After': ", is_after)

2.6 時間序列化

  • func (t Time) MarshalBinary() ([]byte, error) {} // 時間序列化
  • func (t Time) UnmarshalBinary(data []byte) error {} // 反序列化
  • func (t Time) MarshalJSON() ([]byte, error) {} // 時間序列化
  • func (t Time) MarshalText() ([]byte, error) {} // 時間序列化
  • func (t Time) GobEncode() ([]byte, error) {} // 時間序列化
  • func (t Time) GobDecode() ([]byte, error) {} // 時間序列化
// 時間序列化
t_byte, err := t.MarshalJSON()
fmt.Println("'t.MarshalJSON': ", t_byte, err)

// 時間數(shù)據(jù)反序列化
var t_un time.Time
err = t_un.UnmarshalJSON(t_byte)
fmt.Println("'t_un.UnmarshalJSON': ", t_un, err)

3. time.Duration 方法

介紹 time.Duration 時間段接受者的方法:輸出和改變時間段單位抱婉。

  • func (d Duration) String() string // 格式化輸出 Duration
  • func (d Duration) Nanoseconds() int64 // 將時間段表示為納秒
  • func (d Duration) Seconds() float64 // 將時間段表示為秒
  • func (d Duration) Minutes() float64 // 將時間段表示為分鐘
  • func (d Duration) Hours() float64 // 將時間段表示為小時
// time.Duration 時間段
fmt.Println("time.Duration 時間段")
d = time.Duration(10000000000000)

fmt.Printf("'String: %v', 'Nanoseconds: %v', 'Seconds: %v', 'Minutes: %v', 'Hours: %v'\n", 
d.String(), d.Nanoseconds(), d.Seconds(), d.Minutes(), d.Hours())
// 'String: 2h46m40s', 'Nanoseconds: 10000000000000', 'Seconds: 10000', 'Minutes: 166.66666666666666', 'Hours: 2.7777777777777777'

4. time.Location 方法

time.Location 時區(qū)的導(dǎo)出函數(shù)

  • func (l *Location) String() string // 輸出時區(qū)名
  • func FixedZone(name string, offset int) *Location // FixedZone 使用給定的地點名name和時間偏移量offset(單位秒)創(chuàng)建并返回一個Location
  • func LoadLocation(name string) (*Location, error) // LoadLocation 使用給定的名字創(chuàng)建Location
var local *time.Location
local, ok := time.LoadLocation("Asia/Shanghai")
fmt.Printf("%v, %T, %v\n", local, local, ok)

5. 其他方法

  • func Sleep(d Duration) // Sleep阻塞當(dāng)前go程至少d代表的時間段。d<=0時画恰,Sleep會立刻返回
d_second := time.Second
time.Sleep(d_second)

參考資料

可以關(guān)注我的微博了解更多信息:

@剛剛小碼農(nóng)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妥泉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子隐绵,更是在濱河造成了極大的恐慌之众,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件依许,死亡現(xiàn)場離奇詭異棺禾,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)峭跳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進(jìn)店門膘婶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蛀醉,你說我怎么就攤上這事悬襟。” “怎么了滞欠?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵古胆,是天一觀的道長。 經(jīng)常有香客問我筛璧,道長逸绎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任夭谤,我火速辦了婚禮棺牧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘朗儒。我一直安慰自己颊乘,他們只是感情好参淹,可當(dāng)我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著乏悄,像睡著了一般浙值。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上檩小,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天开呐,我揣著相機(jī)與錄音,去河邊找鬼规求。 笑死筐付,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的阻肿。 我是一名探鬼主播瓦戚,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼丛塌!你這毒婦竟也來了较解?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤赴邻,失蹤者是張志新(化名)和其女友劉穎哨坪,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乍楚,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年届慈,在試婚紗的時候發(fā)現(xiàn)自己被綠了徒溪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡金顿,死狀恐怖臊泌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情揍拆,我是刑警寧澤渠概,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站嫂拴,受9級特大地震影響播揪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜筒狠,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一猪狈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辩恼,春花似錦雇庙、人聲如沸谓形。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寒跳。三九已至,卻和暖如春竹椒,著一層夾襖步出監(jiān)牢的瞬間童太,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工碾牌, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留康愤,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓舶吗,卻偏偏與公主長得像征冷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子誓琼,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 01.{ 換行: Opening Brace Can't Be Placed on a Separate Lin...
    碼農(nóng)不器閱讀 2,405評論 0 14
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理检激,服務(wù)發(fā)現(xiàn),斷路器腹侣,智...
    卡卡羅2017閱讀 134,704評論 18 139
  • SwiftDate概況 從Swift發(fā)布起叔收,我們就沒有放棄使用Swift。 當(dāng)然傲隶,我們希望在項目能夠輕松自如地管理...
    Mee_Leo閱讀 10,105評論 1 13
  • fmt格式化字符串 格式:%[旗標(biāo)][寬度][.精度][arg索引]動詞旗標(biāo)有以下幾種:+: 對于數(shù)值類型總是輸出...
    皮皮v閱讀 1,100評論 0 3
  • 原文鏈接 http://ironxu.com/740 本文介紹Go 標(biāo)準(zhǔn)庫 strings 常用導(dǎo)出函數(shù)饺律,結(jié)構(gòu)體及...
    好剛編程閱讀 3,048評論 1 6