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

Go時間格式化的實現(xiàn)

 更新時間:2023年06月28日 14:52:39   作者:王中陽Go  
本文主要介紹了Go時間格式化的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

咋搞捏?

如何在不循環(huán)的情況下,把列表數(shù)據(jù)結(jié)構(gòu)體的時間修改為咱們習(xí)慣的格式,而不是UTC模式

我們要實現(xiàn)的效果如下:

  • created_at 是go語言原生的方式,
  • updated_at 是我們期望優(yōu)化成的方式
{
    "code": 200,
    "data": {
        "count": 12,
        "info": [
            {
                "created_at": "2021-03-17T07:11:24+08:00" //原生方式
                "updated_at": "2021-03-17 07:11:24",  //需要優(yōu)化成這種
            }
        ]
    },
    "message": "成功"
}

引入神器

首先我們引入一個包,在控制臺運行

go get github.com/liamylian/jsontime

下載相關(guān)依賴

go mod download

修改結(jié)構(gòu)體,聲明要處理時間的字段

type Order struct {
    .
    .
    .
    CreatedAt       time.Time `json:"created_at" time_format:"sql_datetime" time_utc:"false"`       // 格式化時間示例
    UpdatedAt       string  `json:"updated_at"`       // 原生狀態(tài)示例
}

取值時調(diào)用MarshalToString把結(jié)構(gòu)體數(shù)據(jù)轉(zhuǎn)為字符串

但是轉(zhuǎn)完的字符串存在反斜線的問題,使用json.RawMessage()處理一下

var timeJson = jsontime.ConfigWithCustomTimeFormat
func AllOrder(c *gin.Context) {
?? ?limitStr := c.DefaultQuery("limit", "10")
?? ?pageStr := c.DefaultQuery("page", "0")
?? ?orderType := c.DefaultQuery("orderType", "desc")
?? ?orderField := c.DefaultQuery("orderField", "id")
?? ?orderSql := orderField + " " + orderType
?? ?limit, _ := strconv.Atoi(limitStr)
?? ?page, _ := strconv.Atoi(pageStr)
?? ?count, res := model.QueryOrder(0, limit, page, orderSql)
?? ?//處理1:MarshalToString
?? ?bytes, _ := timeJson.MarshalToString(&res)
?? ?jsonInfo := map[string]interface{}{
?? ??? ?"count": count,
?? ??? ?//處理2:解決反斜線的問題
?? ??? ?"info": ?json.RawMessage(bytes),?
?? ?}
?? ?c.JSON(http.StatusOK, ReturnJson{
?? ??? ?http.StatusOK,
?? ??? ?jsonInfo,
?? ??? ?"成功",
?? ?})
}

我們最終實現(xiàn)出來的效果

{
    "code": 200,
    "data": {
        "count": 12,
        "info": [
            {
                "updated_at": "2021-03-17 07:13:24",
                "created_at": "2021-03-17 07:11:24",  
            }
        ]
    },
    "message": "成功"
}

好了,通過引入上面的神器就解決了我們的問題。

我們再深入理解一下time包的使用:

time包

time包提供了時間的顯示和測量用的函數(shù)。日歷的計算采用的是公歷。

時間類型

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

func timeDemo() {
?? ?now := time.Now() //獲取當(dāng)前時間
?? ?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.Printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)
}

時間戳

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

基于時間對象獲取時間戳的示例代碼如下:

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

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

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

時間間隔

time.Duration是time包定義的一個類型,它代表兩個時間點之間經(jīng)過的時間,以納秒為單位。time.Duration表示一段時間間隔,可表示的最長時間段大約290年。

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

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秒。

時間操作

Add

我們在日常的編碼過程中可能會遇到要求時間+時間間隔的需求,Go語言的時間對象有提供Add方法如下:

func (t Time) Add(d Duration) Time
舉個例子,求一個小時之后的時間:

func main() {
    now := time.Now()
    later := now.Add(time.Hour) // 當(dāng)前時間加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ū)標(biāo)準(zhǔn)的時間也可以正確比較。本方法和用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ù)
    }
}

時間格式化

時間類型有一個自帶的方法Format進(jìn)行格式化,需要注意的是Go語言中格式化時間模板不是常見的Y-m-d H:M:S而是使用Go的誕生時間2006年1月2號15點04分(記憶口訣為2006 1 2 3 4)。

也許這就是技術(shù)人員的浪漫吧(當(dāng)然,也有人說這事瞎搞)

補充:如果想格式化為12小時方式,需指定PM。

func formatDemo() {
    now := time.Now()
    // 格式化的模板為Go的出生時間2006年1月2號15點04分 Mon Jan
    // 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"))
    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"))
}

解析字符串格式的時間

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", "2019/08/04 14:15:20", loc)
if err != nil {
    fmt.Println(err)
    return
}
fmt.Println(timeObj)
fmt.Println(timeObj.Sub(now))

到此這篇關(guān)于Go時間格式化的實現(xiàn)的文章就介紹到這了,更多相關(guān)Go時間格式化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言中的函數(shù)、閉包、defer、錯誤處理的學(xué)習(xí)教程

    Go語言中的函數(shù)、閉包、defer、錯誤處理的學(xué)習(xí)教程

    Go語言中函數(shù)包含func關(guān)鍵字、函數(shù)名、參數(shù)列表和返回值列表,Go支持普通函數(shù)、匿名函數(shù)和閉包,值傳遞是Go語言中所有函數(shù)參數(shù)的傳遞方式,defer語句用于延遲函數(shù)的執(zhí)行,適合用于資源清理,Go的錯誤處理主要通過error接口、panic函數(shù)和recover函數(shù)來實現(xiàn),鼓勵顯式錯誤處理
    2026-01-01
  • 如何使用?Go?獲取你的?IP?地址(推薦)

    如何使用?Go?獲取你的?IP?地址(推薦)

    在Go語言中,獲取IP地址分為公共IP和私有IP兩種方式,公共IP地址通過外部API獲取,本文給大家介紹如何使用?Go?獲取你的?IP?地址,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • golang中xorm的基本使用說明

    golang中xorm的基本使用說明

    這篇文章主要介紹了golang中xorm的基本使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 一文詳解Golang中的切片數(shù)據(jù)類型

    一文詳解Golang中的切片數(shù)據(jù)類型

    這篇文章主要介紹了一文詳解Golang中的切片數(shù)據(jù)類型,切片是一個種特殊的數(shù)組。是對數(shù)組的一個連續(xù)片段的引用,所以切片是一個引用類型
    2022-09-09
  • Golang內(nèi)存對齊的規(guī)則及實現(xiàn)

    Golang內(nèi)存對齊的規(guī)則及實現(xiàn)

    本文介紹了Golang內(nèi)存對齊的規(guī)則及實現(xiàn),通過合理的內(nèi)存對齊,可以提高程序的執(zhí)行效率和性能,通過對本文的閱讀,讀者可以更好地理解Golang內(nèi)存對齊的原理和技巧,并應(yīng)用于實際編程中
    2023-08-08
  • Golang基于內(nèi)存的鍵值存儲緩存庫go-cache

    Golang基于內(nèi)存的鍵值存儲緩存庫go-cache

    go-cache是一個內(nèi)存中的key:value store/cache庫,適用于單機應(yīng)用程序,本文主要介紹了Golang基于內(nèi)存的鍵值存儲緩存庫go-cache,具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • Go實現(xiàn)HTTP請求轉(zhuǎn)發(fā)的示例代碼

    Go實現(xiàn)HTTP請求轉(zhuǎn)發(fā)的示例代碼

    請求轉(zhuǎn)發(fā)是一項核心且常見的功能,本文主要介紹了Go實現(xiàn)HTTP請求轉(zhuǎn)發(fā)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-05-05
  • golang基于websocket實現(xiàn)的簡易聊天室程序

    golang基于websocket實現(xiàn)的簡易聊天室程序

    這篇文章主要介紹了golang基于websocket實現(xiàn)的簡易聊天室,分析了websocket的下載、安裝及使用實現(xiàn)聊天室功能的相關(guān)技巧,需要的朋友可以參考下
    2016-07-07
  • Go語言如何獲取網(wǎng)卡信息

    Go語言如何獲取網(wǎng)卡信息

    Go語言中net和pcap包提供網(wǎng)絡(luò)接口信息獲取函數(shù),如Interfaces()和FindAllDevs(),通過匹配IP地址關(guān)聯(lián)不同接口數(shù)據(jù),用于網(wǎng)絡(luò)監(jiān)控與分析
    2025-07-07
  • Golang+Vue輕松構(gòu)建Web應(yīng)用的方法步驟

    Golang+Vue輕松構(gòu)建Web應(yīng)用的方法步驟

    本文主要介紹了Golang+Vue輕松構(gòu)建Web應(yīng)用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05

最新評論

东光县| 慈利县| 仙游县| 赣州市| 奇台县| 罗城| 凉城县| 玉溪市| 涡阳县| 盐津县| 华容县| 沁水县| 治县。| 防城港市| 十堰市| 丽江市| 嘉峪关市| 肇庆市| 嘉义市| 江门市| 临夏市| 泗洪县| 泾川县| 苗栗市| 汕尾市| 三都| 崇义县| 新建县| 西贡区| 泉州市| 永安市| 武定县| 岑巩县| 五河县| 高青县| 龙游县| 拜城县| 信阳市| 滨州市| 织金县| 炉霍县|