最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang標準庫time時間包的使用

 更新時間:2023年10月27日 15:05:03   作者:紅蒲公英  
時間和日期是我們編程中經(jīng)常會用到的,本文主要介紹了golang標準庫time時間包的使用,具有一定的參考價值,感興趣的可以了解一下

time包

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

  • time 包提供了一些關(guān)于時間顯示和測量用的函數(shù)。
  • time 包中日歷的計算采用的是公歷,不考慮潤秒。

Go 語言中使用time.Time類型表示時間。我們可以通過time.Now函數(shù)獲取當前的時間對象,然后從時間對象中可以獲取到年、月、日、時、分、秒等信息。

// timeDemo 時間對象的年月日時分秒
func timeDemo() {
	now := time.Now() // 獲取當前時間
	fmt.Printf("current time:%v\n", now)

	year := now.Year()     // 年
	month := now.Month()   // 月
	day := now.Day()       // 日
	hour := now.Hour()     // 小時
	minute := now.Minute() // 分鐘
	second := now.Second() // 秒
	fmt.Println(year, month, day, hour, minute, second)
}

跨時區(qū)

Go 語言中使用 location 來映射具體的時區(qū)。時區(qū)(Time Zone)是根據(jù)世界各國家與地區(qū)不同的經(jīng)度而劃分的時間定義,全球共分為24個時區(qū)。

中國差不多跨5個時區(qū)(壯哉我中國,地大物博),為了時區(qū)的一致,在國內(nèi)通常使用的是北京的時區(qū)。

下面的示例代碼中使用beijing來表示東八區(qū)8小時的偏移量,其中time.FixedZone和time.LoadLocation這兩個函數(shù)則是用來獲取location信息。

// timezoneDemo 時區(qū)示例
func timezoneDemo() {
	// 中國沒有夏令時,使用一個固定的8小時的UTC時差。
	// 對于很多其他國家需要考慮夏令時。
	secondsEastOfUTC := int((8 * time.Hour).Seconds())
	// FixedZone 返回始終使用給定區(qū)域名稱和偏移量(UTC 以東秒)的 Location。
	beijing := time.FixedZone("Beijing Time", secondsEastOfUTC)

	// 如果當前系統(tǒng)有時區(qū)數(shù)據(jù)庫,則可以加載一個位置得到對應(yīng)的時區(qū)
	// 例如,加載紐約所在的時區(qū)
	newYork, err := time.LoadLocation("America/New_York") // UTC-05:00
	if err != nil {
		fmt.Println("load America/New_York location failed", err)
		return
	}
	fmt.Println()
	// 加載上海所在的時區(qū)
	//shanghai, err := time.LoadLocation("Asia/Shanghai") // UTC+08:00
	// 加載東京所在的時區(qū)
	//tokyo, err := time.LoadLocation("Asia/Tokyo") // UTC+09:00

	// 創(chuàng)建時間對象需要指定位置。常用的位置是 time.Local(當?shù)貢r間) 和 time.UTC(UTC時間)。
	//timeInLocal := time.Date(2023, 10, 27, 20, 0, 0, 0, time.Local)  // 系統(tǒng)本地時間
	timeInUTC := time.Date(2023, 10, 27, 12, 0, 0, 0, time.UTC)
	sameTimeInBeijing := time.Date(2023, 10, 27, 20, 0, 0,  beijing)
	sameTimeInNewYork := time.Date(2009, 1, 1, 7, 0, 0, 0, newYork)

	// 北京時間(東八區(qū))比UTC早8小時,所以上面兩個時間看似差了8小時,但表示的是同一個時間
	timesAreEqual := timeInUTC.Equal(sameTimeInBeijing)
	fmt.Println(timesAreEqual)

	// 紐約(西五區(qū))比UTC晚5小時,所以上面兩個時間看似差了5小時,但表示的是同一個時間
	timesAreEqual = timeInUTC.Equal(sameTimeInNewYork)
	fmt.Println(timesAreEqual)
}

注意由于time.loadLocation 依賴系統(tǒng)的時區(qū)數(shù)據(jù)庫,在不確定程序的運行環(huán)境的情況下建議先定義時區(qū)偏移量,然后使用time.FixedZone 的方式指定時區(qū)。

(這個我遇到過,你們敢信,在這個時代,我曾經(jīng)遇到過一個xp系統(tǒng)的電腦。人還不會配置時間,系統(tǒng)時間就有問題。所以一定不能依賴系統(tǒng)的時區(qū)數(shù)據(jù)庫)

時間戳

Unix Time是自1970年1月1日 00:00:00 UTC 至當前時間經(jīng)過的總秒數(shù)。

// timestampDemo 時間戳
func timestampDemo() {
	now := time.Now()        // 獲取當前時間
	timestamp := now.Unix()  // 秒級時間戳
	milli := now.UnixMilli() // 毫秒時間戳 Go1.17+
	micro := now.UnixMicro() // 微秒時間戳 Go1.17+
	nano := now.UnixNano()   // 納秒時間戳
	fmt.Println(timestamp, milli, micro, nano)
}

time 包還提供了一系列將 int64 類型的時間戳轉(zhuǎn)換為時間對象的方法。

這里注意還是得轉(zhuǎn)換一下時區(qū)

secondsEastOfUTC := int((8 * time.Hour).Seconds())
	beijing := time.FixedZone("Beijing Time", secondsEastOfUTC)

	// 北京時間 2022-02-22 22:22:22.000000022 +0800 CST
	t := time.Date(2022, 02, 22, 22, 22, 22, 22, beijing)
var (
		sec  = t.Unix()
		msec = t.UnixMilli()
		usec = t.UnixMicro()
	)

	// 將秒級時間戳轉(zhuǎn)為時間對象(第二個參數(shù)為不足1秒的納秒數(shù))
	timeObj := time.Unix(sec, 22)
	fmt.Println(timeObj)           // 2022-02-22 22:22:22.000000022 +0800 CST
	timeObj = time.UnixMilli(msec) // 毫秒級時間戳轉(zhuǎn)為時間對象
	fmt.Println(timeObj)           // 2022-02-22 22:22:22 +0800 CST
	timeObj = time.UnixMicro(usec) // 微秒級時間戳轉(zhuǎn)為時間對象
	fmt.Println(timeObj)           // 2022-02-22 22:22:22 +0800 CST

時間間隔

time.Duration是time包定義的一個類型,它代表兩個時間點之間經(jīng)過的時間,以納秒為單位。

time.Duration表示一段時間間隔,可表示的最長時間段大約290年。

time.Duration表示1納秒,time.Second表示1秒。

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

源碼

在這里插入圖片描述

時間操作

add

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

Sub

func (t Time) Sub(u Time) Duration

返回一個時間段t-u。

如果結(jié)果超出了Duration可以表示的最大值最小值,將返回最大值最小值。

要獲取時間點t-d(d為Duration),可以使用t.Add(-d)。

Equal

func (t Time) Equal(u Time) bool

判斷兩個時間是否相同,會考慮時區(qū)的影響,因此不同時區(qū)標準的時間也可以正確比較。

這個方法和用t==u不同,這種方法還會比較地點和時區(qū)信息。

Before

func (t Time) Before(u Time) bool

如果t代表的時間點在u之前,返回真;否則返回假。

After

func (t Time) After(u Time) bool

如果t代表的時間點在u之后,返回真;否則返回假。

定時器

使用time.Tick(時間間隔)來設(shè)置定時器,定時器的本質(zhì)上是一個通道(channel)

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

時間格式化

time.Format函數(shù)能夠?qū)⒁粋€時間對象格式化輸出為指定布局的文本表示形式,需要注意的是 Go 語言中時間格式化的布局不是常見的Y-m-d H:M:S,而是使用2023-10-27 15:04:05.000

  • 如果想格式化為12小時格式,需在格式化布局中添加PM。
  • 小數(shù)部分想保留指定位數(shù)就寫0,如果想省略末尾可能的0就寫 9。
// formatDemo 時間格式化
func formatDemo() {
	now := time.Now()
	// 格式化的模板為 2006-01-02 15:04:05

	// 24小時制
	fmt.Println(now.Format("2006-01-02 15:04:05.000 Mon Jan"))
	// 12小時制
	fmt.Println(now.Format("2006-01-02 03:04:05.000 PM Mon Jan"))

	// 小數(shù)點后寫0,因為有3個0所以格式化輸出的結(jié)果也保留3位小數(shù)
	fmt.Println(now.Format("2006/01/02 15:04:05.000")) // 2022/02/27 00:10:42.960
	// 小數(shù)點后寫9,會省略末尾可能出現(xiàn)的0
	fmt.Println(now.Format("2006/01/02 15:04:05.999")) // 2022/02/27 00:10:42.96

	// 只格式化時分秒部分
	fmt.Println(now.Format("15:04:05"))
	// 只格式化日期部分
	fmt.Println(now.Format("2006.01.02"))
}

在這里插入圖片描述

解析字符串格式的時間

對于從文本的時間表示中解析出時間對象,time包中提供了time.Parse和time.ParseInLocation兩個函數(shù)。

其中time.Parse在解析時不需要額外指定時區(qū)信息。

// parseDemo 指定時區(qū)解析時間
func parseDemo() {
	// 在沒有時區(qū)指示符的情況下,time.Parse 返回UTC時間
	timeObj, err := time.Parse("2006/01/02 15:04:05", "2022/10/05 11:25:20")
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(timeObj) // 2022-10-05 11:25:20 +0000 UTC
	// 在有時區(qū)指示符的情況下,time.Parse 返回對應(yīng)時區(qū)的時間表示
	// RFC3339     = "2006-01-02T15:04:05Z07:00"
	timeObj, err = time.Parse(time.RFC3339, "2023-10-05T11:25:20+08:00")
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(timeObj) // 2022-10-05 11:25:20 +0800 CST
}

在這里插入圖片描述

time.ParseInLocation函數(shù)需要在解析時額外指定時區(qū)信息。

func parseDemo() {
	now := time.Now()
	fmt.Println(now)
	// 加載時區(qū)
	loc, err := time.LoadLocation("Asia/Shanghai")
	if err != nil {
		fmt.Println(err)
		return
	}
	// 按照指定時區(qū)和指定格式解析字符串時間
	timeObj, err := time.ParseInLocation("2006/01/02 15:04:05", "2022/10/05 11:25:20", loc)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(timeObj)
	fmt.Println(timeObj.Sub(now))
}

在這里插入圖片描述

到此這篇關(guān)于golang標準庫time時間包的使用的文章就介紹到這了,更多相關(guān)golang time標準庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • Go語言學(xué)習(xí)之反射的用法詳解

    Go語言學(xué)習(xí)之反射的用法詳解

    反射指的是運行時動態(tài)的獲取變量的相關(guān)信息。本文將為大家詳細介紹Go語言中反射的用法,文中的示例代碼講解詳細,感興趣的可以了解一下
    2022-04-04
  • Golang泛型與類型約束的用法詳解

    Golang泛型與類型約束的用法詳解

    這篇文章主要介紹了Golang泛型與類型約束的用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 使用Go語言實現(xiàn)的WebDAV內(nèi)存文件系統(tǒng)

    使用Go語言實現(xiàn)的WebDAV內(nèi)存文件系統(tǒng)

    這篇文章主要為大家詳細介紹了如何使用Go語言實現(xiàn)的WebDAV內(nèi)存文件系統(tǒng),文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-11-11
  • Go語言中內(nèi)存管理逃逸分析詳解

    Go語言中內(nèi)存管理逃逸分析詳解

    所謂的逃逸分析(Escape?analysis)是指由編譯器決定內(nèi)存分配的位置嗎不需要程序員指定。本文就來和大家簡單分析一下Go語言中內(nèi)存管理逃逸吧
    2023-03-03
  • Golang導(dǎo)入包的幾種方式(點,別名與下劃線)

    Golang導(dǎo)入包的幾種方式(點,別名與下劃線)

    這篇文章主要介紹了Golang導(dǎo)入包的幾種方式(點,別名與下劃線),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • go語言處理JSON和XML數(shù)據(jù)示例解析

    go語言處理JSON和XML數(shù)據(jù)示例解析

    這篇文章主要介紹了go語言處理JSON和XML數(shù)據(jù)的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • Go泛型之泛型約束示例詳解

    Go泛型之泛型約束示例詳解

    這篇文章主要給大家介紹了關(guān)于Go泛型之泛型約束的相關(guān)資料,泛型是靜態(tài)語言中的一種編程方式,這種編程方式可以讓算法不再依賴于某個具體的數(shù)據(jù)類型,而是通過將數(shù)據(jù)類型進行參數(shù)化,以達到算法可復(fù)用的目的,需要的朋友可以參考下
    2023-12-12
  • go語言遍歷文件夾示例

    go語言遍歷文件夾示例

    這篇文章主要介紹了go語言遍歷文件夾示例,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下
    2015-03-03
  • GoFrame框架gset使用對比PHP?Java?Redis優(yōu)勢

    GoFrame框架gset使用對比PHP?Java?Redis優(yōu)勢

    這篇文章主要為大家介紹了GoFrame框架gset對比PHP?Java?Redis的使用優(yōu)勢詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Go語言中JSON文件的讀寫操作

    Go語言中JSON文件的讀寫操作

    本文主要介紹了Go語言JSON文件的讀寫操作,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評論

巴楚县| 太白县| 五大连池市| 阿拉善盟| 南平市| 桂平市| 麻江县| 毕节市| 浪卡子县| 嘉定区| 喀喇沁旗| 孝义市| 来凤县| 西乌珠穆沁旗| 当雄县| 惠州市| 华安县| 凉山| 曲靖市| 监利县| 天柱县| 青河县| 金寨县| 清河县| 上高县| 凌云县| 德钦县| 彰化市| 卓尼县| 公安县| 大冶市| 金川县| 佛山市| 岳阳县| 长宁县| 确山县| 江陵县| 洛宁县| 平湖市| 阳高县| 周至县|