Zaman çıkarılıyor. Go'da zamandan süre


105

Elimde bir time.Timedeğer var time.Now()ve tam olarak 1 ay önce olan başka bir zaman almak istiyorum.

Çıkarma işleminin mümkün olduğunu biliyorum time.Sub()(bir başkasını istiyor time.Time), ama bu a time.Durationile sonuçlanacak ve ona tam tersi şekilde ihtiyacım var.

Yanıtlar:


126

AddDate'i deneyin :

package main

import (
    "fmt"
    "time"
)

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

    fmt.Println("now:", now)

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

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

Üretir:

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

Oyun alanı: http://play.golang.org/p/QChq02kisT


33
bir zaman çıkarmaya ne dersiniz?
Thomas Browne

Subzaman çıkarmak için. Ah!
Abhi

Çıkarılınca bir zaman ve çıkarılarak zaman farklı operasyonlardır. Bir zamanı çıkarmak için time.Now (), Sub (time.Time {}) çağırarak farkı Süre olarak elde edersiniz. Bir süreyi çıkarmak için , 1 dakika diyelim, zaman yapmanız gerekir.Şimdi (). Ekle ( zaman.Dakika * -1 ). Sub () ve Add () arasındaki simetri eksikliği çileden çıkarıyor.
jcope

141

Thomas Browne'ın yorumuna yanıt olarak, lnmx'in cevabı yalnızca bir tarihi çıkarmak için işe yaradığından, işte kodunun bir zamandan zamanı çıkarmak için çalışan bir modifikasyonu.

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

Üretir:

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

Bahsetmiyorum bile, ihtiyaçlarınıza göre time.Hourveya time.Secondyerine kullanabilirsiniz time.Minute.

Oyun alanı: https://play.golang.org/p/DzzH4SA3izp


4
ParseDurationStatik değerler için kullanıcı kullanmayın! Sadece kullanın -10 * time.Minute, bu sabitler bunun için tanımlanmıştır. Örneğin time.Now().Add(-10 * time.Minute), ihtiyacınız olan her şey.
Dave C

22
Vay canına, zaman API'si çok tutarsız. time.Add bir süre eklemektir, time.Sub ise bir zamanı çıkarmaktır. Bu yanıtı bulduğuma sevindim çünkü Sub işlevine bakıyordum ve Add'den farklı bir imzası olduğunu asla tahmin edemezdim.
laurent

8
Ayrıca örtük dönüştürür gitmek olduğuna dikkat now.Add(-10 * time.Minute)etmek now.Add(time.Duration(-10) * time.Minute)bir int değeri tarafından bir süre çarparak zaman senin ... Hatayla durumda
notzippy

52

Aşağıdakileri reddedebilirsiniz time.Duration:

then := now.Add(- dur)

Hatta karşılaştırabilirsiniz time.DurationAgainst 0:

if dur > 0 {
    dur = - dur
}

then := now.Add(dur)

Http://play.golang.org/p/ml7svlL4eW adresinde çalışan bir örnek görebilirsiniz.


2
Yine de bir sorun var: -1 * durişe yarayacak, ancak d := -1 ; dur = d * durbir hata oluşturacak: "uyumsuz tipler int ve time.Duration"
BlakBat

4
Soru başlığı için doğru cevap budur ve cevap olarak işaretlenmelidir.
selalerer

0

Kılavuza göretime.ParseDuration negatif süreleri memnuniyetle kabul edecek olanlar var . Aksi takdirde, ilk etapta kesin bir süre alabileceğiniz bir süreyi reddetmeye gerek yoktur.

Örneğin, bir buçuk saati çıkarmanız gerektiğinde, bunu şu şekilde yapabilirsiniz:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.