Go語(yǔ)言基礎(chǔ)之time標(biāo)準(zhǔn)庫(kù)

時(shí)間和日期是我們編程中經(jīng)常會(huì)用到的泉哈,本文主要介紹了Go語(yǔ)言內(nèi)置的time包的基本用法帚桩。

time包

time包提供了時(shí)間的顯示和測(cè)量用的函數(shù)瑟匆。日歷的計(jì)算采用的是公歷处渣。

時(shí)間類型

time.Time類型表示時(shí)間。我們可以通過(guò)time.Now()函數(shù)獲取當(dāng)前的時(shí)間對(duì)象诱贿,然后獲取時(shí)間對(duì)象的年月日時(shí)分秒等信息娃肿。示例代碼如下:

func timeDemo() {
    now := time.Now() //獲取當(dāng)前時(shí)間
    fmt.Printf("current time:%v\n", now)

    year := now.Year()     //年
    month := now.Month()   //月
    day := now.Day()       //日
    hour := now.Hour()     //小時(shí)
    minute := now.Minute() //分鐘
    second := now.Second() //秒
    fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)
}

時(shí)間戳

時(shí)間戳是自1970年1月1日(08:00:00GMT)至當(dāng)前時(shí)間的總毫秒數(shù)咕缎。它也被稱為Unix時(shí)間戳(UnixTimestamp)。

基于時(shí)間對(duì)象獲取時(shí)間戳的示例代碼如下:

func timestampDemo() {
    now := time.Now()            //獲取當(dāng)前時(shí)間
    timestamp1 := now.Unix()     //時(shí)間戳
    timestamp2 := now.UnixNano() //納秒時(shí)間戳
    fmt.Printf("current timestamp1:%v\n", timestamp1)
    fmt.Printf("current timestamp2:%v\n", timestamp2)
}

使用time.Unix()函數(shù)可以將時(shí)間戳轉(zhuǎn)為時(shí)間格式料扰。

func timestampDemo2(timestamp int64) {
    timeObj := time.Unix(timestamp, 0) //將時(shí)間戳轉(zhuǎn)為時(shí)間格式
    fmt.Println(timeObj)
    year := timeObj.Year()     //年
    month := timeObj.Month()   //月
    day := timeObj.Day()       //日
    hour := timeObj.Hour()     //小時(shí)
    minute := timeObj.Minute() //分鐘
    second := timeObj.Second() //秒
    fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)
}

時(shí)間間隔

time.Durationtime包定義的一個(gè)類型凭豪,它代表兩個(gè)時(shí)間點(diǎn)之間經(jīng)過(guò)的時(shí)間,以納秒為單位晒杈。time.Duration表示一段時(shí)間間隔嫂伞,可表示的最長(zhǎng)時(shí)間段大約290年。

time包中定義的時(shí)間間隔類型的常量如下:

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

例如:time.Duration表示1納秒拯钻,time.Second表示1秒帖努。

時(shí)間操作

Add

我們?cè)谌粘5木幋a過(guò)程中可能會(huì)遇到要求時(shí)間+時(shí)間間隔的需求,Go語(yǔ)言的時(shí)間對(duì)象有提供Add方法如下:

func (t Time) Add(d Duration) Time

舉個(gè)例子粪般,求一個(gè)小時(shí)之后的時(shí)間:

func main() {
    now := time.Now()
    later := now.Add(time.Hour) // 當(dāng)前時(shí)間加1小時(shí)后的時(shí)間
    fmt.Println(later)
}

Sub

求兩個(gè)時(shí)間之間的差值:

func (t Time) Sub(u Time) Duration

返回一個(gè)時(shí)間段t-u拼余。如果結(jié)果超出了Duration可以表示的最大值/最小值,將返回最大值/最小值亩歹。要獲取時(shí)間點(diǎn)t-d(d為Duration)匙监,可以使用t.Add(-d)。

now := time.Now() //本地的時(shí)間
fmt.Println(now)
//明天的這個(gè)時(shí)間
//按照指定格式取解析一個(gè)字符串格式的時(shí)間
time.Parse("2009-01-02 15:04:05","2022-01-10 14:41:50" )
//按照東八區(qū)的時(shí)區(qū)和格式取解析一個(gè)字符串格式的時(shí)間
//根據(jù)字符串加載時(shí)區(qū)
loc, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
    fmt.Printf("load loc failed, err:%v\n", err)
    return
}
//按照指定時(shí)區(qū)解析時(shí)間
time0bj, err := time.ParseInLocation("2009-01-02 15:04:05","2022-01-10 14:41:50", loc)
if err != nil {
    fmt.Printf("parse time failed, err:%v\n", err)
    return
}
fmt.Println(timeObj)
//時(shí)間對(duì)象相減
td := timeObj.Sub(now)
fmt.Println(td)

Equal

func (t Time) Equal(u Time) bool

判斷兩個(gè)時(shí)間是否相同捆憎,會(huì)考慮時(shí)區(qū)的影響舅柜,因此不同時(shí)區(qū)標(biāo)準(zhǔn)的時(shí)間也可以正確比較。本方法和用t==u不同躲惰,這種方法還會(huì)比較地點(diǎn)和時(shí)區(qū)信息。

Before

func (t Time) Before(u Time) bool

如果t代表的時(shí)間點(diǎn)在u之前变抽,返回真础拨;否則返回假。

After

func (t Time) After(u Time) bool

如果t代表的時(shí)間點(diǎn)在u之后绍载,返回真诡宗;否則返回假。

Sleep

func Sleep(d Duration)

傳入的為一個(gè)Duration击儡,所以如果想睡眠5s鐘塔沃,不能直接寫 time.Sleep(5) ,而應(yīng)該寫time.Sleep(5 * time.Second)

其中time.Second就是一個(gè)Duration類型阳谍,表示1s的時(shí)間間隔蛀柴,乘系數(shù)5就得到5s的時(shí)間間隔。

n := 5 //int
time.Sleep(time.Duration(n) * time.Second)

go提供了不同的時(shí)間單位:

const (
    Nanosecond  Duration = 1
    Microsecond          = 1000 * Nanosecond
    Millisecond          = 1000 * Microsecond
    Second               = 1000 * Millisecond
    Minute               = 60 * Second
    Hour                 = 60 * Minute
)
Nanosecond表示1納秒的時(shí)間間隔

Microsecond表示1微妙的時(shí)間間隔

Millisecond表示1毫秒的時(shí)間間隔

Second表示1秒的時(shí)間間隔

Minute表示1分鐘的時(shí)間間隔

Hour表示1小時(shí)的時(shí)間間隔

想要睡眠的時(shí)間可以使用以上的常量自由組合

比如睡眠1小時(shí)10分5秒:

time.Sleep(1*time.Hour + 10*time.Minute + 5*time.Second)

定時(shí)器

使用time.Tick(時(shí)間間隔)來(lái)設(shè)置定時(shí)器矫夯,定時(shí)器的本質(zhì)上是一個(gè)通道(channel)鸽疾。

func tickDemo() {
    ticker := time.Tick(time.Second) //定義一個(gè)1秒間隔的定時(shí)器
    for i := range ticker {
        fmt.Println(i)//每秒都會(huì)執(zhí)行的任務(wù)
    }
}

時(shí)間格式化

時(shí)間類型有一個(gè)自帶的方法Format進(jìn)行格式化,需要注意的是Go語(yǔ)言中格式化時(shí)間模板不是常見(jiàn)的Y-m-d H:M:S而是使用Go的誕生時(shí)間2006年1月2號(hào)15點(diǎn)04分(記憶口訣為2006 1 2 3 4)训貌。也許這就是技術(shù)人員的浪漫吧制肮。

補(bǔ)充:如果想格式化為12小時(shí)方式冒窍,需指定PM

func formatDemo() {
    now := time.Now()
    // 格式化的模板為Go的出生時(shí)間2006年1月2號(hào)15點(diǎn)04分 Mon Jan
    // 24小時(shí)制
    fmt.Println(now.Format("2006-01-02 15:04:05.000 Mon Jan"))
    // 12小時(shí)制
    fmt.Println(now.Format("2006-01-02 03:04:05.000 PM Mon Jan"))
    fmt.Println(now.Format("2006/01/02 15:04"))
    fmt.Println(now.Format("15:04 2006/01/02"))
    fmt.Println(now.Format("2006/01/02"))
}

解析字符串格式的時(shí)間

now := time.Now()
fmt.Println(now)
// 加載時(shí)區(qū)
loc, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
    fmt.Println(err)
    return
}
// 按照指定時(shí)區(qū)和指定格式解析字符串時(shí)間
timeObj, err := time.ParseInLocation("2006/01/02 15:04:05", "2019/08/04 14:15:20", loc)
if err != nil {
    fmt.Println(err)
    return
}
fmt.Println(timeObj)
fmt.Println(timeObj.Sub(now))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末豺鼻,一起剝皮案震驚了整個(gè)濱河市综液,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌儒飒,老刑警劉巖谬莹,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異约素,居然都是意外死亡届良,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門圣猎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)士葫,“玉大人,你說(shuō)我怎么就攤上這事送悔÷裕” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵欠啤,是天一觀的道長(zhǎng)荚藻。 經(jīng)常有香客問(wèn)我,道長(zhǎng)洁段,這世上最難降的妖魔是什么应狱? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮祠丝,結(jié)果婚禮上疾呻,老公的妹妹穿的比我還像新娘。我一直安慰自己写半,他們只是感情好岸蜗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著叠蝇,像睡著了一般璃岳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悔捶,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天铃慷,我揣著相機(jī)與錄音,去河邊找鬼炎功。 笑死枚冗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蛇损。 我是一名探鬼主播赁温,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼坛怪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了股囊?” 一聲冷哼從身側(cè)響起袜匿,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稚疹,沒(méi)想到半個(gè)月后居灯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡内狗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年怪嫌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柳沙。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡岩灭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出赂鲤,到底是詐尸還是另有隱情噪径,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布数初,位于F島的核電站找爱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏泡孩。R本人自食惡果不足惜车摄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望仑鸥。 院中可真熱鬧练般,春花似錦、人聲如沸锈候。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)泵琳。三九已至,卻和暖如春誊役,著一層夾襖步出監(jiān)牢的瞬間获列,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工蛔垢, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留击孩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓鹏漆,卻偏偏與公主長(zhǎng)得像巩梢,于是被迫代替她去往敵國(guó)和親创泄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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

  • Go內(nèi)置的time包提供了時(shí)間顯示和測(cè)量的函數(shù) 時(shí)間可分為時(shí)間點(diǎn)和時(shí)間段括蝠,為此Go提供了兩種基礎(chǔ)數(shù)據(jù)類型time....
    JunChow520閱讀 283評(píng)論 0 0
  • 原文鏈接 http://ironxu.com/747 介紹Go 標(biāo)準(zhǔn)庫(kù) time 常用導(dǎo)出函數(shù)鞠抑,結(jié)構(gòu)體及其方法。 ...
    好剛編程閱讀 16,962評(píng)論 2 11
  • golang使用的版本: go version go1.10.3 一:功能介紹 time的一些功能忌警,比如時(shí)區(qū)搁拙,像l...
    九卷技術(shù)錄閱讀 538評(píng)論 0 1
  • 在工程化的Go語(yǔ)言開發(fā)項(xiàng)目中和簸,Go語(yǔ)言的源碼復(fù)用是建立在包(package)基礎(chǔ)之上的催式。本文介紹了Go語(yǔ)言中如何定...
    雪上霜閱讀 241評(píng)論 0 0
  • 類型 time.Time{} 時(shí)間類型,包含了秒和納秒以及Location time.Month() type M...
    吃貓的魚0閱讀 31,769評(píng)論 0 4