Goの時間からの時間と時間の減算


104

time.Timeから取得した値があり、time.Now()ちょうど1か月前の別の時刻を取得したいと考えています。

私はtime.Sub()(別のが必要time.Time)で減算が可能であることを知っていますが、その結果はにtime.Durationなり、逆にそれが必要になります。

回答:


123

AddDateを試してください:

package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Now()

    fmt.Println("now:", now)

    then := now.AddDate(0, -1, 0)

    fmt.Println("then:", then)
}

生成する:

now: 2009-11-10 23:00:00 +0000 UTC
then: 2009-10-10 23:00:00 +0000 UTC

遊び場:http : //play.golang.org/p/QChq02kisT


33
時間を引くのはどうですか?
Thomas Browne、

Sub時間を引く。ああ!
Abhi

139

Thomas Browneのコメントに応えて、lnmxの答えは日付を減算するためにのみ機能するため、time.Time型から時間を減算するために機能する彼のコードの変更を次に示します。

package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Now()

    fmt.Println("now:", now)

    count := 10
    then := now.Add(time.Duration(-count) * time.Minute)
    // if we had fix number of units to subtract, we can use following line instead fo above 2 lines. It does type convertion automatically.
    // then := now.Add(-10 * time.Minute)
    fmt.Println("10 minutes ago:", then)
}

生成する:

now: 2009-11-10 23:00:00 +0000 UTC
10 minutes ago: 2009-11-10 22:50:00 +0000 UTC

言うまでもなく、必要に応じて、time.Hourまたはtime.Second代わりに使用することもできtime.Minuteます。

遊び場:https : //play.golang.org/p/DzzH4SA3izp


4
ParseDuration静的な値を使用しないでください!-10 * time.Minuteこれらの定数が定義されているのは、を使用するだけです。たとえば、time.Now().Add(-10 * time.Minute)必要なものはすべてです。
デイブC

22
うわー、時間APIはとても矛盾しています。time.Addは継続時間を追加するためのものであり、time.Subは時間を減算するためのものです。Sub関数を見ていて、Addとは異なるシグネチャがあるとは思わなかったので、この回答を見つけてよかったです。
ローレント、2015年

8
また、継続時間にint値を乗算するとエラーが発生する場合に備えて、goは暗黙的にに変換now.Add(-10 * time.Minute)now.Add(time.Duration(-10) * time.Minute)れることにも注意してください...
notzippy

51

あなたは否定することができますtime.Duration

then := now.Add(- dur)

あなたもtime.Durationに対して比較することができます0

if dur > 0 {
    dur = - dur
}

then := now.Add(dur)

あなたはhttp://play.golang.org/p/ml7svlL4eWで実用的な例を見ることができます


2
ただし、問題はあります-1 * durが、機能しますがd := -1 ; dur = d * dur、エラーが発生します。「int型とtime.Duration型が一致しません」
BlakBat

4
これが質問のタイトルに対する正しい回答であり、回答としてマークする必要があります。
selalerer 2016年

0

マニュアルに従ってtime.ParseDuration負の期間を喜んで受け入れるものがあります。別の言い方をすれば、最初から正確な期間を取得できる期間を否定する必要はありません。

たとえば、1時間半減算する必要がある場合は、次のように実行できます。

package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Now()

    fmt.Println("now:", now)

    duration, _ := time.ParseDuration("-1.5h")

    then := now.Add(duration)

    fmt.Println("then:", then)
}

https://play.golang.org/p/63p-T9uFcZo

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.