การลบเวลาระยะเวลาจากเวลาใน Go


108

ฉันมีtime.Timeค่าที่ได้รับtime.Now()และฉันต้องการได้รับอีกครั้งซึ่งตรงกับ 1 เดือนที่แล้ว

ฉันรู้ว่าการลบเป็นไปได้ด้วยtime.Sub()(ซึ่งต้องการอีกอันtime.Time) แต่นั่นจะส่งผลให้ a time.Durationและฉันต้องการมันในทางอื่น

คำตอบ:


128

ลอง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

4
การลบเวลาและการลบเวลาเป็นการดำเนินการที่แตกต่างกัน หากต้องการลบเวลาคุณจะเรียกเวลา Now (). Sub (time.Time {}) เพื่อรับผลต่างเป็น Duration ในการลบระยะเวลาพูด 1 นาทีคุณต้องทำเวลา Now () เพิ่ม ( time.Minute * -1 ) การขาดความสมมาตรระหว่าง Sub () และ Add () นั้นทำให้โกรธ
jcope

144

เพื่อตอบสนองต่อความคิดเห็นของ Thomas Browne เนื่องจากคำตอบของ lnmxใช้ได้เฉพาะกับการลบวันที่เท่านั้นนี่คือการปรับเปลี่ยนรหัสของเขาที่ใช้สำหรับการลบเวลาออกจากเวลาประเภทเวลา

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


5
อย่าใช้ParseDurationค่าคงที่! เพียงแค่ใช้-10 * time.Minuteนั่นคือสิ่งที่ค่าคงที่กำหนดไว้ เพียงแค่time.Now().Add(-10 * time.Minute)เป็นสิ่งที่คุณต้องการ
Dave C

22
ว้าวเวลา API ไม่สอดคล้องกัน เวลาเพิ่มคือการเพิ่มระยะเวลาในขณะที่เวลาย่อยคือการแทนที่เวลา ดีใจที่ฉันพบคำตอบนี้เพราะฉันกำลังดูฟังก์ชั่นย่อยและฉันคงเดาไม่ถูกว่ามันมีลายเซ็นที่ต่างจาก Add
laurent

8
นอกจากนี้ทราบว่าไปโดยปริยายแปลงnow.Add(-10 * time.Minute)ไปnow.Add(time.Duration(-10) * time.Minute)ในกรณีที่คุณได้รับข้อผิดพลาดเมื่อคูณระยะเวลาโดยค่า int ...
notzippy

56

คุณสามารถลบล้าง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จะสร้างข้อผิดพลาด: "mismatched types int and time.Duration"
BlakBat

4
นั่นคือคำตอบที่ถูกต้องสำหรับชื่อคำถามและควรระบุว่าเป็นคำตอบ
selalerer

0

มีtime.ParseDurationที่มีความสุขจะยอมรับระยะเวลาเชิงลบตามคู่มือ ไม่เช่นนั้นก็ไม่จำเป็นต้องลบล้างระยะเวลาที่คุณจะได้ระยะเวลาที่แน่นอนตั้งแต่แรก

เช่นเมื่อคุณต้องการลบล้างหนึ่งชั่วโมงครึ่งคุณสามารถทำได้ดังนี้:

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.