Subtraindo time.Duração do tempo em Go

104

Eu tenho um time.Timevalor obtido de time.Now()e desejo obter outro horário que é exatamente 1 mês atrás.

Eu sei que subtrair é possível com time.Sub()(que quer outro time.Time), mas isso resultará em um time.Duratione eu preciso disso ao contrário.

Martijn van Maasakkers
fonte

Respostas:

124

Experimente 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)
}

Produz:

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

Playground: http://play.golang.org/p/QChq02kisT

lnmx
fonte
33
que tal subtrair um tempo?
Thomas Browne
Subpara subtrair o tempo. Duh!
Abhi
139

Em resposta ao comentário de Thomas Browne, porque a resposta de lnmx só funciona para subtrair uma data, aqui está uma modificação de seu código que funciona para subtrair o tempo de um tempo. Tipo de tempo.

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)
}

Produz:

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

Já para não falar, você também pode usar time.Hourou em time.Secondvez de time.Minuteconforme suas necessidades.

Playground: https://play.golang.org/p/DzzH4SA3izp

cchio
fonte
4
Não ParseDurationuse valores estáticos! Basta usar -10 * time.Minute, é para isso que essas constantes são definidas. Por exemplo, time.Now().Add(-10 * time.Minute)é tudo o que você precisa.
Dave C
22
Uau, a API do tempo é tão inconsistente. time.Add é para adicionar uma duração, enquanto time.Sub é para subtrair um tempo. Ainda bem que encontrei esta resposta porque estava olhando para a função Sub e nunca teria imaginado que ela tem uma assinatura diferente de Add.
Laurent,
8
Observe também que ir implicitamente convertidos now.Add(-10 * time.Minute)para now.Add(time.Duration(-10) * time.Minute)no caso de seu recebendo um erro quando multiplicando a duração por um valor int ...
notzippy
51

Você pode negar um time.Duration:

then := now.Add(- dur)

Você pode até comparar um time.Durationcom 0:

if dur > 0 {
    dur = - dur
}

then := now.Add(dur)

Você pode ver um exemplo prático em http://play.golang.org/p/ml7svlL4eW

docwhat
fonte
2
Mas há um problema: -1 * durfuncionará, mas d := -1 ; dur = d * durgerará um erro: "tipos incompatíveis int e
time.Duration
4
Essa é a resposta certa para o título da pergunta e deve ser marcada como a resposta.
selalerer
0

time.ParseDurationque aceitará alegremente durações negativas, conforme o manual . Colocado de outra forma, não há necessidade de negar uma duração onde você pode obter uma duração exata em primeiro lugar.

Por exemplo, quando você precisa subtrair uma hora e meia, você pode fazer assim:

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

sanmai
fonte