Mengurangi waktu Durasi dari waktu di Go

104

Saya memiliki time.Timenilai yang didapat dari time.Now()dan saya ingin mendapatkan waktu lain tepatnya 1 bulan yang lalu.

Saya tahu pengurangan dimungkinkan dengan time.Sub()(yang menginginkan yang lain time.Time), tetapi itu akan menghasilkan a time.Durationdan saya membutuhkannya sebaliknya.

Martijn van Maasakkers
sumber

Jawaban:

124

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

Menghasilkan:

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

Taman bermain: http://play.golang.org/p/QChq02kisT

lnmx
sumber
33
bagaimana dengan mengurangi waktu?
Thomas Browne
Subuntuk mengurangi waktu. Duh!
Abhi
139

Menanggapi komentar Thomas Browne, karena jawaban lnmx hanya berfungsi untuk mengurangkan tanggal, berikut ini adalah modifikasi kodenya yang berfungsi untuk mengurangi waktu dari suatu waktu.

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

Menghasilkan:

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

Tidak menyebutkan, Anda juga dapat menggunakan time.Houratau time.Secondbukan time.Minutesesuai kebutuhan Anda.

Taman bermain: https://play.golang.org/p/DzzH4SA3izp

cchio
sumber
4
Jangan gunakan ParseDurationuntuk nilai statis! Cukup gunakan -10 * time.Minute, untuk itulah konstanta itu didefinisikan. Misalnya saja time.Now().Add(-10 * time.Minute)semua yang Anda butuhkan.
Dave C
22
Wow, API waktu sangat tidak konsisten. time.Add untuk menambahkan durasi, sedangkan time.Sub adalah untuk mengurangi waktu. Senang saya menemukan jawaban ini karena saya melihat pada fungsi Sub dan saya tidak akan pernah menduga itu memiliki tanda tangan yang berbeda dari Add.
laurent
8
Perhatikan juga bahwa go secara implisit mengonversi now.Add(-10 * time.Minute)menjadi now.Add(time.Duration(-10) * time.Minute)jika Anda mendapatkan kesalahan saat mengalikan durasi dengan nilai int ...
notzippy
51

Anda dapat meniadakan time.Duration:

then := now.Add(- dur)

Anda bahkan dapat membandingkan time.Durationterhadap 0:

if dur > 0 {
    dur = - dur
}

then := now.Add(dur)

Anda dapat melihat contoh yang berfungsi di http://play.golang.org/p/ml7svlL4eW

docwhat
sumber
2
Namun ada batasan : -1 * durakan berfungsi, tetapi d := -1 ; dur = d * durakan menghasilkan kesalahan: "jenis tidak cocok int dan waktu.Duration"
BlakBat
4
Itu adalah jawaban yang benar untuk judul pertanyaan dan harus ditandai sebagai jawabannya.
selalerer
0

Ada time.ParseDurationyang akan dengan senang hati menerima durasi negatif, sesuai manual . Jika tidak, tidak perlu meniadakan durasi di mana Anda bisa mendapatkan durasi yang tepat di tempat pertama.

Misalnya, saat Anda perlu mengurangi satu setengah jam, Anda dapat melakukannya seperti ini:

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
sumber