日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
創(chuàng)新互聯(lián)GO教程:Go語(yǔ)言time包:時(shí)間和日期

時(shí)間和日期是我們開(kāi)發(fā)中經(jīng)常會(huì)用到的,Go語(yǔ)言中的 time 包提供了時(shí)間顯示和測(cè)量等所用的函數(shù),本節(jié)我們就來(lái)介紹一下 time 包的基本用法。

兩當(dāng)網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)于2013年創(chuàng)立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)

time 包簡(jiǎn)介

時(shí)間一般包含時(shí)間值和時(shí)區(qū),可以從Go語(yǔ)言中 time 包的源碼中看出:

type Time struct {
    // wall and ext encode the wall time seconds, wall time nanoseconds,
    // and optional monotonic clock reading in nanoseconds.
    //
    // From high to low bit position, wall encodes a 1-bit flag (hasMonotonic),
    // a 33-bit seconds field, and a 30-bit wall time nanoseconds field.
    // The nanoseconds field is in the range [0, 999999999].
    // If the hasMonotonic bit is 0, then the 33-bit field must be zero
    // and the full signed 64-bit wall seconds since Jan 1 year 1 is stored in ext.
    // If the hasMonotonic bit is 1, then the 33-bit field holds a 33-bit
    // unsigned wall seconds since Jan 1 year 1885, and ext holds a
    // signed 64-bit monotonic clock reading, nanoseconds since process start.
    wall uint64
    ext  int64

    // loc specifies the Location that should be used to
    // determine the minute, hour, month, day, and year
    // that correspond to this Time.
    // The nil location means UTC.
    // All UTC times are represented with loc==nil, never loc==&utcLoc.
    loc *Location
}

上面代碼中:

  • wall:表示距離公元 1 年 1 月 1 日 00:00:00UTC 的秒數(shù);
  • ext:表示納秒;
  • loc:代表時(shí)區(qū),主要處理偏移量,不同的時(shí)區(qū),對(duì)應(yīng)的時(shí)間不一樣。

如何正確表示時(shí)間呢?

公認(rèn)最準(zhǔn)確的計(jì)算應(yīng)該是使用“原子震蕩周期”所計(jì)算的物理時(shí)鐘了(Atomic Clock, 也被稱為原子鐘),這也被定義為標(biāo)準(zhǔn)時(shí)間(International Atomic Time)。

而我們常??匆?jiàn)的 UTC(Universal Time Coordinated,世界協(xié)調(diào)時(shí)間)就是利用這種 Atomic Clock 為基準(zhǔn)所定義出來(lái)的正確時(shí)間。UTC 標(biāo)準(zhǔn)時(shí)間是以 GMT(Greenwich Mean Time,格林尼治時(shí)間)這個(gè)時(shí)區(qū)為主,所以本地時(shí)間與 UTC 時(shí)間的時(shí)差就是本地時(shí)間與 GMT 時(shí)間的時(shí)差。

UTC + 時(shí)區(qū)差 = 本地時(shí)間

國(guó)內(nèi)一般使用的是北京時(shí)間,與 UTC 的時(shí)間關(guān)系如下:

UTC + 8 個(gè)小時(shí) = 北京時(shí)間

在Go語(yǔ)言的 time 包里面有兩個(gè)時(shí)區(qū)變量,如下:

  • time.UTC:UTC 時(shí)間
  • time.Local:本地時(shí)間

同時(shí),Go語(yǔ)言還提供了 LoadLocation 方法和 FixedZone 方法來(lái)獲取時(shí)區(qū)變量,如下:

FixedZone(name string, offset int) *Location

其中,name 為時(shí)區(qū)名稱,offset 是與 UTC 之前的時(shí)差。

LoadLocation(name string) (*Location, error)

其中,name 為時(shí)區(qū)的名字。

時(shí)間的獲取

1) 獲取當(dāng)前時(shí)間

我們可以通過(guò) time.Now() 函數(shù)來(lái)獲取當(dāng)前的時(shí)間對(duì)象,然后通過(guò)事件對(duì)象來(lái)獲取當(dāng)前的時(shí)間信息。示例代碼如下:

package main

import (
    "fmt"
    "time"
)

func main() {
    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)
}

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

current time:2019-12-12 12:33:19.4712277 +0800 CST m=+0.006980401
2019-12-12 12:33:19

2) 獲取時(shí)間戳

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

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

package main

import (
    "fmt"
    "time"
)

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

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

現(xiàn)在的時(shí)間戳:1576127858
現(xiàn)在的納秒時(shí)間戳:1576127858829900100

使用 time.Unix() 函數(shù)可以將時(shí)間戳轉(zhuǎn)為時(shí)間格式,示例代碼如下:

package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Now()                  //獲取當(dāng)前時(shí)間
    timestamp := now.Unix()            //時(shí)間戳
    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)
}

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

2019-12-12 13:24:09 +0800 CST
2019-12-12 13:24:09

3) 獲取當(dāng)前是星期幾

time 包中的 Weekday 函數(shù)能夠返回某個(gè)時(shí)間點(diǎn)所對(duì)應(yīng)是一周中的周幾,示例代碼如下:

package main

import (
    "fmt"
    "time"
)

func main() {
    //時(shí)間戳
    t := time.Now()
    fmt.Println(t.Weekday().String())
}

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

Thursday

時(shí)間操作函數(shù)

1) Add

我們?cè)谌粘5拈_(kāi)發(fā)過(guò)程中可能會(huì)遇到要求某個(gè)時(shí)間 + 時(shí)間間隔之類的需求,Go語(yǔ)言中的 Add 方法如下:

func (t Time) Add(d Duration) Time

Add 函數(shù)可以返回時(shí)間點(diǎn) t + 時(shí)間間隔 d 的值。

【示例】求一個(gè)小時(shí)之后的時(shí)間:

package main

import (
    "fmt"
    "time"
)

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

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

2019-12-12 16:00:29.9866943 +0800 CST m=+3600.007978201

2) 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)。

3) Equal

判斷兩個(gè)時(shí)間是否相同:

func (t Time) Equal(u Time) bool

Equal 函數(shù)會(huì)考慮時(shí)區(qū)的影響,因此不同時(shí)區(qū)標(biāo)準(zhǔn)的時(shí)間也可以正確比較,Equal 方法和用 t==u 不同,Equal 方法還會(huì)比較地點(diǎn)和時(shí)區(qū)信息。

4) Before

判斷一個(gè)時(shí)間點(diǎn)是否在另一個(gè)時(shí)間點(diǎn)之前:

func (t Time) Before(u Time) bool

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

5) After

判斷一個(gè)時(shí)間點(diǎn)是否在另一個(gè)時(shí)間點(diǎn)之后:

func (t Time) After(u Time) bool

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

定時(shí)器

使用 time.Tick(時(shí)間間隔) 可以設(shè)置定時(shí)器,定時(shí)器的本質(zhì)上是一個(gè)通道(channel),示例代碼如下:

package main

import (
    "fmt"
    "time"
)

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

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

2019-12-12 15:14:26.4158067 +0800 CST m=+16.007460701
2019-12-12 15:14:27.4159467 +0800 CST m=+17.007600701
2019-12-12 15:14:28.4144689 +0800 CST m=+18.006122901
2019-12-12 15:14:29.4159581 +0800 CST m=+19.007612101
2019-12-12 15:14:30.4144337 +0800 CST m=+20.006087701
...

時(shí)間格式化

時(shí)間類型有一個(gè)自帶的 Format 方法進(jìn)行格式化,需要注意的是Go語(yǔ)言中格式化時(shí)間模板不是常見(jiàn)的
Y-m-d H:M:S 而是使用Go語(yǔ)言的誕生時(shí)間 2006 年 1 月 2 號(hào) 15 點(diǎn) 04 分 05 秒。

提示:如果想將時(shí)間格式化為 12 小時(shí)格式,需指定 PM。

package main

import (
    "fmt"
    "time"
)

func main() {
    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"))
}

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

2019-12-12 15:20:52.037 Thu Dec
2019-12-12 03:20:52.037 PM Thu Dec
2019/12/12 15:20
15:20 2019/12/12
2019/12/12

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

Parse 函數(shù)可以解析一個(gè)格式化的時(shí)間字符串并返回它代表的時(shí)間。

func Parse(layout, value string) (Time, error)

與 Parse 函數(shù)類似的還有 ParseInLocation 函數(shù)。

func ParseInLocation(layout, value string, loc *Location) (Time, error)

ParseInLocation 與 Parse 函數(shù)類似,但有兩個(gè)重要的不同之處:

  • 第一,當(dāng)缺少時(shí)區(qū)信息時(shí),Parse 將時(shí)間解釋為 UTC 時(shí)間,而 ParseInLocation 將返回值的 Location 設(shè)置為 loc;
  • 第二,當(dāng)時(shí)間字符串提供了時(shí)區(qū)偏移量信息時(shí),Parse 會(huì)嘗試去匹配本地時(shí)區(qū),而 ParseInLocation 會(huì)去匹配 loc。

示例代碼如下:

package main

import (
    "fmt"
    "time"
)

func main() {
    var layout string = "2006-01-02 15:04:05"
    var timeStr string = "2019-12-12 15:22:12"

    timeObj1, _ := time.Parse(layout, timeStr)
    fmt.Println(timeObj1)

    timeObj2, _ := time.ParseInLocation(layout, timeStr, time.Local)
    fmt.Println(timeObj2)
}

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

2019-12-12 15:22:12 +0000 UTC
2019-12-12 15:22:12 +0800 CST


網(wǎng)站題目:創(chuàng)新互聯(lián)GO教程:Go語(yǔ)言time包:時(shí)間和日期
URL分享:http://www.5511xx.com/article/coocshj.html