日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

golang中time包之時(shí)間間隔格式化和秒、毫秒、納秒等時(shí)間戳格式輸出的方法實(shí)例_Golang

作者:玉梅小洋 ? 更新時(shí)間: 2022-10-04 編程語(yǔ)言

獲取當(dāng)前時(shí)間的年、月、日、時(shí)、分、秒的方法如下:

	// 獲取當(dāng)前時(shí)間
	now := time.Now()

	// 當(dāng)前時(shí)間的年、月、日、小時(shí)、分鐘、秒和納秒都可以通過(guò)現(xiàn)有接口直接獲取
	year := now.Year()
	month := now.Month()
	day := now.Day()
	hour := now.Hour()
	minute := now.Minute()
	second := now.Second()
	nanosecond := now.Nanosecond()

	// 當(dāng)前時(shí)間的微秒和毫秒是通過(guò)納秒計(jì)算生成
	microsecond := nanosecond / 1e3
	millisecond := nanosecond / 1e6

	fmt.Println(now.Format("2006-01-02 15:04:05.000000000"))
	fmt.Println(year, month, day, hour, minute, second, nanosecond, microsecond, millisecond)

運(yùn)行結(jié)果如下:

# 當(dāng)前時(shí)間格式輸出
2022-06-09 19:25:52.022598620
2022 June 9 19 25 52 22598620 22598 22

獲取從1970到現(xiàn)在經(jīng)過(guò)的時(shí)間的方法如下:

	// 獲取從1970經(jīng)過(guò)的時(shí)間,秒和納秒都可以通過(guò)現(xiàn)有接口直接獲取
	sec := now.Unix()     // 時(shí)間戳位數(shù)為10
	ms := now.UnixMilli() // 時(shí)間戳位數(shù)為13
	us := now.UnixMicro() // 時(shí)間戳位數(shù)為16
	ns := now.UnixNano()  // 時(shí)間戳位數(shù)為19
	fmt.Printf("sec:%v\n ms:%v\n us:%v\n ns:%v\n", sec, ms, us, ns)

運(yùn)行結(jié)果如下:

# 1970經(jīng)過(guò)的時(shí)間格式輸出
sec:1654773952
?ms:1654773952022
?us:1654773952022598
?ns:1654773952022598620

時(shí)間間隔格式化輸出方法

	// 時(shí)間間隔返回的是time.Duration,下面以1h1m1s1ms1us1ns的時(shí)間間隔舉例,測(cè)試各種格式的打印效果
	duration := 1*time.Hour + 1*time.Minute + 1*time.Second +
		1*time.Millisecond + 1*time.Microsecond + 1*time.Nanosecond
	// 直接使用%v打印,不轉(zhuǎn)換sec、ms或其他。
	fmt.Printf("duration:%v\n", duration)
	fmt.Printf("duration:%6v\n", duration)
	fmt.Printf("duration:%.6v\n", duration)
	fmt.Printf("duration:%.3v\n", duration)

	// duration支持Hours()、 Minutes()、Seconds() 和
	// Milliseconds()、Microseconds()、Nanoseconds()接口
	// 前三個(gè)接口返回類(lèi)型為float64可以通過(guò)0.3f打印小數(shù)點(diǎn)后的數(shù),
	// 后三個(gè)為int64,是整數(shù),小數(shù)點(diǎn)后都是0
	// 下面列舉秒和毫秒的格式打印,其他時(shí)間單位可以參考秒和毫秒

	// 秒的打印格式%f可以打印小數(shù)點(diǎn)后9位,精確到納秒
	fmt.Printf("duration:%vsec\n", duration.Seconds())
	fmt.Printf("duration:%0.3fsec\n", duration.Seconds())
	fmt.Printf("duration:%0.6fsec\n", duration.Seconds())

	// 毫秒沒(méi)有小數(shù)點(diǎn),都是整數(shù),轉(zhuǎn)換成float后,小數(shù)點(diǎn)后都是0
	fmt.Printf("duration:%vms\n", duration.Milliseconds())
	fmt.Printf("duration:%.3dms\n", duration.Milliseconds())
	fmt.Printf("duration:%.3fms\n", float64(duration.Milliseconds()))
}

行結(jié)果如下:

# 1h1m1s1ms1us1ns的時(shí)間間隔舉例格式輸出
# %v沒(méi)有單位轉(zhuǎn)換的時(shí)間輸出
duration:1h1m1.001001001s
duration:1h1m1.001001001s
duration:1h1m1.
duration:1h1

# 秒的格式輸出
duration:3661.001001001sec
duration:3661.001sec
duration:3661.001001sec

# 毫秒的格式輸出
duration:3661001ms
duration:3661001ms
duration:3661001.000ms

通過(guò)測(cè)試程序可以看到:

1.沒(méi)時(shí)間單位轉(zhuǎn)換的格式輸出,直接用%v能精確到ns,%.3V,只是對(duì)輸出的字符串進(jìn)行了切割。此處建議直接用%v即可。

2.對(duì)于秒的格式輸出,%v精確到小數(shù)點(diǎn)9位,即納秒。當(dāng)然可以根據(jù)%f的格式調(diào)整,例如%.3f精確到毫秒

3.對(duì)于毫秒的格式輸出,直接用%v或%d即可,轉(zhuǎn)換成float64沒(méi)有意義

一般在統(tǒng)計(jì)一個(gè)函數(shù)或一段程序運(yùn)行了多長(zhǎng)時(shí)間,一般建議使用第二種方式,轉(zhuǎn)換成秒的格式輸出,再根據(jù)精度調(diào)整%f的格式即可。

第一種方式有可能出現(xiàn)時(shí)間單位不統(tǒng)一,例如一個(gè)是分鐘,一個(gè)是秒。

上面例子完成的代碼如下:

package main

import (
	"fmt"
	"time"
)

func main() {
	// 獲取當(dāng)前時(shí)間
	now := time.Now()

	// 當(dāng)前時(shí)間的年、月、日、小時(shí)、分鐘、秒和納秒都可以通過(guò)現(xiàn)有接口直接獲取
	year := now.Year()
	month := now.Month()
	day := now.Day()
	hour := now.Hour()
	minute := now.Minute()
	second := now.Second()
	nanosecond := now.Nanosecond()

	// 當(dāng)前時(shí)間的微秒和毫秒是通過(guò)納秒計(jì)算生成
	microsecond := nanosecond / 1e3
	millisecond := nanosecond / 1e6

	fmt.Println(now.Format("2006-01-02 15:04:05.000000000"))
	fmt.Println(year, month, day, hour, minute, second, nanosecond, microsecond, millisecond)

	// 獲取從1970經(jīng)過(guò)的時(shí)間,秒和納秒都可以通過(guò)現(xiàn)有接口直接獲取
	sec := now.Unix()     // 時(shí)間戳位數(shù)為10
	ms := now.UnixMilli() // 時(shí)間戳位數(shù)為13
	us := now.UnixMicro() // 時(shí)間戳位數(shù)為16
	ns := now.UnixNano()  // 時(shí)間戳位數(shù)為19
	fmt.Printf("sec:%v\n ms:%v\n us:%v\n ns:%v\n", sec, ms, us, ns)


	// 時(shí)間間隔返回的是time.Duration,下面以1h1m1s1ms1us1ns的時(shí)間間隔舉例,測(cè)試各種格式的打印效果
	duration := 1*time.Hour + 1*time.Minute + 1*time.Second +
		1*time.Millisecond + 1*time.Microsecond + 1*time.Nanosecond
	// 直接使用%v打印,不轉(zhuǎn)換sec、ms或其他。
	fmt.Printf("duration:%v\n", duration)
	fmt.Printf("duration:%6v\n", duration)
	fmt.Printf("duration:%.6v\n", duration)
	fmt.Printf("duration:%.3v\n", duration)

	// duration支持Hours()、 Minutes()、Seconds() 和
	// Milliseconds()、Microseconds()、Nanoseconds()接口
	// 前三個(gè)接口返回類(lèi)型為float64可以通過(guò)0.3f打印小數(shù)點(diǎn)后的數(shù),
	// 后三個(gè)為int64,是整數(shù),小數(shù)點(diǎn)后都是0
	// 下面列舉秒和毫秒的格式打印,其他時(shí)間單位可以參考秒和毫秒

	// 秒的打印格式%f可以打印小數(shù)點(diǎn)后9位,精確到納秒
	fmt.Printf("duration:%vsec\n", duration.Seconds())
	fmt.Printf("duration:%0.3fsec\n", duration.Seconds())
	fmt.Printf("duration:%0.6fsec\n", duration.Seconds())

	// 毫秒沒(méi)有小數(shù)點(diǎn),都是整數(shù),轉(zhuǎn)換成float后,小數(shù)點(diǎn)后都是0
	fmt.Printf("duration:%vms\n", duration.Milliseconds())
	fmt.Printf("duration:%.3dms\n", duration.Milliseconds())
	fmt.Printf("duration:%.3fms\n", float64(duration.Milliseconds()))
}

下面是時(shí)間間隔的時(shí)間單位轉(zhuǎn)換的源碼:

// time.go

// Nanoseconds returns the duration as an integer nanosecond count.
func (d Duration) Nanoseconds() int64 { return int64(d) }

// Microseconds returns the duration as an integer microsecond count.
func (d Duration) Microseconds() int64 { return int64(d) / 1e3 }

// Milliseconds returns the duration as an integer millisecond count.
func (d Duration) Milliseconds() int64 { return int64(d) / 1e6 }

// These methods return float64 because the dominant
// use case is for printing a floating point number like 1.5s, and
// a truncation to integer would make them not useful in those cases.
// Splitting the integer and fraction ourselves guarantees that
// converting the returned float64 to an integer rounds the same
// way that a pure integer conversion would have, even in cases
// where, say, float64(d.Nanoseconds())/1e9 would have rounded
// differently.

// Seconds returns the duration as a floating point number of seconds.
func (d Duration) Seconds() float64 {
	sec := d / Second
	nsec := d % Second
	return float64(sec) + float64(nsec)/1e9
}

// Minutes returns the duration as a floating point number of minutes.
func (d Duration) Minutes() float64 {
	min := d / Minute
	nsec := d % Minute
	return float64(min) + float64(nsec)/(60*1e9)
}

// Hours returns the duration as a floating point number of hours.
func (d Duration) Hours() float64 {
	hour := d / Hour
	nsec := d % Hour
	return float64(hour) + float64(nsec)/(60*60*1e9)
}

補(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"))
}

總結(jié)

原文鏈接:https://blog.csdn.net/SaberJYang/article/details/125209495

欄目分類(lèi)
最近更新