web-dev-qa-db-ja.com

2つのtime.Timeオブジェクトの違い

「Go」に非常に新しい。質問は基本的なものかもしれません。

Time.Timeオブジェクトが2つあり、時間/分/秒の点で2つの違いを取得したいです。まあ言ってみれば:

t1 = 2016-09-09 19:09:16 +0530 IST
t2 = 2016-09-09 19:09:16 +0530 IST

上記の場合、差は0なので、00:00:00が返されます。別のケースを考えてみましょう:

t1 = 2016-09-14 14:12:48 +0530 IST
t2 = 2016-09-14 14:18:29 +0530 IST

この場合、差は00:05:41になります。 https://godoc.org/time を見ましたが、それから何もできませんでした。

17
Hemant Bhargava

Time.Sub() を使用して、2つの _time.Time_ 値の差を取得できます。結果は _time.Duration_

印刷すると、_time.Duration_は自身を「インテリジェントに」フォーマットします。

_t1 := time.Now()
t2 := t1.Add(time.Second * 341)

fmt.Println(t1)
fmt.Println(t2)

diff := t2.Sub(t1)
fmt.Println(diff)
_

出力:

_2009-11-10 23:00:00 +0000 UTC
2009-11-10 23:05:41 +0000 UTC
5m41s
_

時刻形式_HH:mm:ss_が必要な場合は、_time.Time_値を構成し、その Time.Format() メソッドを次のように使用できます。

_out := time.Time{}.Add(diff)
fmt.Println(out.Format("15:04:05"))
_

出力:

_00:05:41
_

Go Playground の例を試してください。

もちろん、これは時差が1日未満の場合にのみ機能します。違いがより大きくなる場合、それは別の話です。結果には、日、月、年を含める必要があります。複雑さが大幅に増加します。詳細については、この質問を参照してください。

golang time.Since()と月と年

そこで提示されたソリューションは、署名付きの関数を表示することでこの問題を解決します。

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

時間が24時間以内であっても使用できます(この場合、yearmonth、およびdayは_0_になります)。

26
icza

実際、timeパッケージのドキュメントで説明されています。

https://godoc.org/time#Time.Sub

https://godoc.org/time#Duration.Hours

Sub()を使用してDurationオブジェクトを作成し、Seconds()Minutes()Hours()のいずれかを使用する必要があります。

package main

import (
        "fmt"
        "time"
)

func main() {
        t1 := time.Date(1984, time.November, 3, 13, 0, 0, 0, time.UTC)
        t2 := time.Date(1984, time.November, 3, 10, 0, 0, 0, time.UTC)
        fmt.Printf("The hours diffrence is: %d", t1.Sub(t2).Hours())
}
8
Shmulik Klein

Shmulik Kleinの答えを補完するには:

時間のバラバラの時間/分/秒を計算する別の方法。

https://play.golang.org/p/VRoXG5NxLo

package main

import (
    "fmt"
    "math"
    "time"
)

func main() {
    t1 := time.Date(1984, time.November, 3, 13, 0, 0, 0, time.UTC)
    t2 := time.Date(1984, time.November, 3, 10, 23, 34, 0, time.UTC)

    hs := t1.Sub(t2).Hours()

    hs, mf := math.Modf(hs)
    ms := mf * 60

    ms, sf := math.Modf(ms)
    ss := sf * 60

    fmt.Println(hs, "hours", ms, "minutes", ss, "seconds")
}

2時間36分25.999999999999375秒

注意:

  • float64タイプの使用によるわずかな精度低下
  • うるう秒を無視し、1分ごとに60秒があると仮定します
2
thwd