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
एक समय को घटाने के बारे में क्या?
थॉमस ब्राउन

Subसमय घटाना। ओह!
अभि

139

थॉमस ब्राउन के टिप्पणी के जवाब में , क्योंकि 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


4
ParseDurationस्थिर मूल्यों के लिए उपयोगकर्ता मत बनो ! बस उपयोग करें -10 * time.Minute, यही उन स्थिरांक के लिए परिभाषित किया गया है। जैसे कि बस time.Now().Add(-10 * time.Minute)आप सभी की आवश्यकता होगी।
डेव सी

22
वाह, समय एपीआई इतना असंगत है। time.Add एक अवधि जोड़ना है, जबकि time.Sub एक समय घटाना है। खुशी है कि मुझे यह जवाब मिला क्योंकि मैं उप फ़ंक्शन को देख रहा था और मैंने कभी नहीं सोचा होगा कि इसमें ऐड से अलग हस्ताक्षर हैं।
लौरेंट

8
यह भी ध्यान रखें कि परोक्ष धर्मान्तरित जाना 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
यह प्रश्न के शीर्षक के लिए सही उत्तर है और इसे उत्तर के रूप में चिह्नित किया जाना चाहिए।
सेलेरर

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.