第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

time.Since() 有幾個月和幾年

time.Since() 有幾個月和幾年

Go
桃花長相依 2022-01-04 10:36:38
我正在嘗試轉(zhuǎn)換這樣的時間戳:2015-06-27T09:34:22+00:00到格式后的時間,所以它會說像 9 個月前 1 天 2 小時 30 分 2 秒。類似的東西。我使用time.Parse并time.Since達到這個目的:6915h7m47.6901559s但是我如何從那里轉(zhuǎn)換?我的想法是這樣的:for hours > 24 {        days++        hours -= 24}但問題在于,這在幾個月內(nèi)不會準確,因為幾個月可能有 28、30 和 31 天。有沒有更好的方法來實現(xiàn)我想要的?
查看完整描述

3 回答

?
慕斯王

TA貢獻1864條經(jīng)驗 獲得超2個贊

前言:我在 中發(fā)布了此實用程序github.com/icza/gox,請參閱timex.Diff()


一個月中的天數(shù)取決于日期,就像一年中的天數(shù)(閏年)。

如果您time.Since()用來獲取自一個time.Time值以來經(jīng)過的時間,或者當您time.Time使用該Time.Sub()方法計算兩個值之間的差異時,結(jié)果是 atime.Duration丟失了時間上下文(就像Duration時間差以納秒為單位)。這意味著您無法準確無誤地計算出一個Duration值的年、月等差異。

正確的解決方案必須計算時間上下文中的差異。您可以計算每個字段(年、月、日、小時、分鐘、秒)的差異,然后將結(jié)果標準化為沒有任何負值。Time如果它們之間的關(guān)系不是預(yù)期的,還建議交換這些值。

歸一化意味著如果一個值是負數(shù),加上那個字段的最大值,然后將下一個字段減1。例如,如果seconds是負數(shù),加起來60minutes1。要注意的一件事是在對天差進行歸一化時(月中的天數(shù)),必須應(yīng)用適當月份中的天數(shù)。用這個小技巧可以很容易地計算出來:

// Max days in year y1, month M1
t := time.Date(y1, M1, 32, 0, 0, 0, 0, time.UTC)
daysInMonth := 32 - t.Day()

這背后的邏輯是32任何一個月中的一天都大于最大天數(shù)。它將自動標準化(額外的天數(shù)滾動到下個月,天數(shù)適當減少)。當我們從 32 中減去歸一化后的天數(shù)時,我們會得到當月的最后一天。

時區(qū)處理:

如果我們傳入的兩個時間值都在同一時區(qū) ( time.Location) 中,差異計算才會給出正確的結(jié)果。我們將檢查合并到我們的函數(shù)中:如果不是這種情況,我們將使用以下Time.In()方法“轉(zhuǎn)換”一個時間值與另一個時間值位于同一位置:

if a.Location() != b.Location() {
    b = b.In(a.Location())}

這是一個計算年、月、日、小時、分鐘、秒差異的解決方案:

func diff(a, b time.Time) (year, month, day, hour, min, sec int) {

    if a.Location() != b.Location() {

        b = b.In(a.Location())

    }

    if a.After(b) {

        a, b = b, a

    }

    y1, M1, d1 := a.Date()

    y2, M2, d2 := b.Date()


    h1, m1, s1 := a.Clock()

    h2, m2, s2 := b.Clock()


    year = int(y2 - y1)

    month = int(M2 - M1)

    day = int(d2 - d1)

    hour = int(h2 - h1)

    min = int(m2 - m1)

    sec = int(s2 - s1)


    // Normalize negative values

    if sec < 0 {

        sec += 60

        min--

    }

    if min < 0 {

        min += 60

        hour--

    }

    if hour < 0 {

        hour += 24

        day--

    }

    if day < 0 {

        // days in month:

        t := time.Date(y1, M1, 32, 0, 0, 0, 0, time.UTC)

        day += 32 - t.Day()

        month--

    }

    if month < 0 {

        month += 12

        year--

    }


    return

}

一些測試:


var a, b time.Time

a = time.Date(2015, 5, 1, 0, 0, 0, 0, time.UTC)

b = time.Date(2016, 6, 2, 1, 1, 1, 1, time.UTC)

fmt.Println(diff(a, b)) // Expected: 1 1 1 1 1 1


a = time.Date(2016, 1, 2, 0, 0, 0, 0, time.UTC)

b = time.Date(2016, 2, 1, 0, 0, 0, 0, time.UTC)

fmt.Println(diff(a, b)) // Expected: 0 0 30 0 0 0


a = time.Date(2016, 2, 2, 0, 0, 0, 0, time.UTC)

b = time.Date(2016, 3, 1, 0, 0, 0, 0, time.UTC)

fmt.Println(diff(a, b)) // Expected: 0 0 28 0 0 0


a = time.Date(2015, 2, 11, 0, 0, 0, 0, time.UTC)

b = time.Date(2016, 1, 12, 0, 0, 0, 0, time.UTC)

fmt.Println(diff(a, b)) // Expected: 0 11 1 0 0 0

輸出如預(yù)期:


1 1 1 1 1 1

0 0 30 0 0 0

0 0 28 0 0 0

0 11 1 0 0 0

在Go Playground上試試。


要計算您的年齡:


// Your birthday: let's say it's January 2nd, 1980, 3:30 AM

birthday := time.Date(1980, 1, 2, 3, 30, 0, 0, time.UTC)

year, month, day, hour, min, sec := diff(birthday, time.Now())


fmt.Printf("You are %d years, %d months, %d days, %d hours, %d mins and %d seconds old.",

    year, month, day, hour, min, sec)

示例輸出:


You are 36 years, 3 months, 8 days, 11 hours, 57 mins and 41 seconds old.

Go 游樂場時間開始的神奇日期/時間是:2009-11-10 23:00:00 UTC

這是 Go 首次宣布的時間。讓我們計算一下 Go 的年齡:


goAnnounced := time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC)

year, month, day, hour, min, sec := diff(goAnnounced, time.Now())

fmt.Printf("Go was announced "+

    "%d years, %d months, %d days, %d hours, %d mins and %d seconds ago.",

    year, month, day, hour, min, sec)

輸出:


Go was announced 6 years, 4 months, 29 days, 16 hours, 53 mins and 31 seconds ago.


查看完整回答
反對 回復(fù) 2022-01-04
?
莫回無

TA貢獻1865條經(jīng)驗 獲得超7個贊

izca提出的解決方案很棒,但它遺漏了一件事。如果添加如下示例,可以看到效果:


a = time.Date(2015, 1, 11, 0, 0, 0, 0, time.UTC)

b = time.Date(2015, 3, 10, 0, 0, 0, 0, time.UTC)

fmt.Println(diff(a, b))

// Expected: 0 1 27 0 0 0

// Actual output: 0 1 30 0 0 0


該代碼是根據(jù)第一個月的總天數(shù) ( y1,M1)計算下一個不完整月份的剩余天數(shù) ( ),但需要從較晚日期月份 ( y2,M2-1)的前一個月開始計算。


最終代碼如下:


package main


import (

    "fmt"

    "time"

)


func DaysIn(year int, month time.Month) int {

    return time.Date(year, month, 0, 0, 0, 0, 0, time.UTC).Day()

}


func Elapsed(from, to time.Time) (inverted bool, years, months, days, hours, minutes, seconds, nanoseconds int) {

    if from.Location() != to.Location() {

        to = to.In(to.Location())

    }


    inverted = false

    if from.After(to) {

        inverted = true

        from, to = to, from

    }


    y1, M1, d1 := from.Date()

    y2, M2, d2 := to.Date()


    h1, m1, s1 := from.Clock()

    h2, m2, s2 := to.Clock()


    ns1, ns2 := from.Nanosecond(), to.Nanosecond()


    years = y2 - y1

    months = int(M2 - M1)

    days = d2 - d1


    hours = h2 - h1

    minutes = m2 - m1

    seconds = s2 - s1

    nanoseconds = ns2 - ns1


    if nanoseconds < 0 {

        nanoseconds += 1e9

        seconds--

    }

    if seconds < 0 {

        seconds += 60

        minutes--

    }

    if minutes < 0 {

        minutes += 60

        hours--

    }

    if hours < 0 {

        hours += 24

        days--

    }

    if days < 0 {

        days += DaysIn(y2, M2-1)

        months--

    }

    if days < 0 {

        days += DaysIn(y2, M2)

        months--

    }

    if months < 0 {

        months += 12

        years--

    }

    return

}


func main() {

    var a, b time.Time

    a = time.Date(2015, 5, 1, 0, 0, 0, 0, time.UTC)

    b = time.Date(2016, 6, 2, 1, 1, 1, 1, time.UTC)

    fmt.Println(Elapsed(a, b)) // Expected: 1 1 1 1 1 1


    a = time.Date(2016, 1, 2, 0, 0, 0, 0, time.UTC)

    b = time.Date(2016, 2, 1, 0, 0, 0, 0, time.UTC)

    fmt.Println(Elapsed(a, b)) // Expected: 0 0 30 0 0 0


    a = time.Date(2016, 2, 2, 0, 0, 0, 0, time.UTC)

    b = time.Date(2016, 3, 1, 0, 0, 0, 0, time.UTC)

    fmt.Println(Elapsed(a, b)) // Expected: 0 0 28 0 0 0


    a = time.Date(2015, 2, 11, 0, 0, 0, 0, time.UTC)

    b = time.Date(2016, 1, 12, 0, 0, 0, 0, time.UTC)

    fmt.Println(Elapsed(a, b)) // Expected: 0 11 1 0 0 0


    a = time.Date(2015, 1, 11, 0, 0, 0, 0, time.UTC)

    b = time.Date(2015, 3, 10, 0, 0, 0, 0, time.UTC)

    fmt.Println(Elapsed(a, b)) // Expected: 0 1 27 0 0 0


    a = time.Date(2015, 12, 31, 0, 0, 0, 0, time.UTC)

    b = time.Date(2015, 3, 1, 0, 0, 0, 0, time.UTC)

    fmt.Println(Elapsed(a, b)) // Expected: 0 9 30 0 0 0


    a = time.Date(2015, 12, 31, 0, 0, 0, 0, time.UTC)

    b = time.Date(2016, 3, 1, 0, 0, 0, 0, time.UTC)

    fmt.Println(Elapsed(a, b)) // Expected: 0 2 1 0 0 0


    a = time.Date(2015, 12, 31, 0, 0, 0, 0, time.UTC)

    b = time.Date(2016, 2, 28, 0, 0, 0, 0, time.UTC)

    fmt.Println(Elapsed(a, b)) // Expected: 0 2 1 0 0 0

}


查看完整回答
反對 回復(fù) 2022-01-04
?
斯蒂芬大帝

TA貢獻1827條經(jīng)驗 獲得超8個贊

如果你使用 PostgreSQL,你可以很容易地用age函數(shù)得到結(jié)果。


假設(shè)您有兩個日期a和b。


就像 icza 說的,要小心,a并且b必須在同一時區(qū)。


首先,您可以age使用兩個參數(shù)進行調(diào)用,在您的情況下為 datea和 date b。此函數(shù)返回包含年、月、周、日、小時、分鐘、秒和毫秒的間隔類型。


SELECT age('2016-03-31', '2016-06-30'); -- result is: -2 mons -30 days

第二種可能性是使用age帶有一個參數(shù)的函數(shù)。結(jié)果也是一個間隔,但在這種情況下,age從 current_date(午夜)中減去。假設(shè)今天是 2016/06/16:


SELECT age(timestamp '2016-06-30'); -- result is: -14 days

請注意,timestamp需要關(guān)鍵字來投射日期“2016-06-30”。


有關(guān)更多詳細信息,您可以使用date_part或直接extract返回一個特定字段(年、月、日...)的函數(shù)。


SELECT date_part('month', age('2016-03-31', '2016-06-30')); --result is: -2

SELECT date_part('day',   age('2016-03-31', '2016-06-30')); --result is: -30

完整請求:


SELECT  

    date_part('year', diff) as year

  , date_part('month', diff) as month

  , date_part('day', diff) as day

FROM (

  SELECT age(timestamp '2016-06-30') AS diff

) as qdiff;


-- result is: 

-- year month day

-- 0    0     -14

(使用 CTE - 通用表表達式):


WITH qdiff AS (

  SELECT age(timestamp '2016-06-30') AS diff

)

SELECT  

    date_part('year', diff) as year

  , date_part('month', diff) as month

  , date_part('day', diff) as day

FROM qdiff


-- result is: 

-- year month day

-- 0    0     -14

PostgreSQL 文檔(當前版本):https : //www.postgresql.org/docs/current/static/functions-datetime.html


查看完整回答
反對 回復(fù) 2022-01-04
  • 3 回答
  • 0 關(guān)注
  • 245 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號