减去时间.Go中时间的持续时间


104

我有一个time.Time价值time.Now(),我想得到另一个正好是1个月前的时间。

我知道可以用time.Sub()(想要另一个time.Time)进行减法,但这将导致a,time.Duration而我反过来需要它。

Answers:



139

为了回应托马斯·布朗(Thomas Browne)的评论,因为lnmx的答案仅适用于减去日期,所以这是对他的代码的修改,适用于从time.Time类型中减去时间。

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.Hourtime.Second代替time.Minute根据需要。

游乐场:https : //play.golang.org/p/DzzH4SA3izp


4
不要使用ParseDuration静态值!只需使用-10 * time.Minute,这就是那些常量的定义。例如,这time.Now().Add(-10 * time.Minute)就是您所需要的。
Dave C'3

22
哇,时间API太不一致了。time.Add是添加持续时间,而time.Sub是减去时间。很高兴我找到了这个答案,因为我正在查看Sub函数,而且我永远不会想到它具有与Add不同的签名。
洛朗(Larent),2015年

8
还要注意,如果将持续时间乘以int值时遇到错误,go会隐式转换now.Add(-10 * time.Minute)now.Add(time.Duration(-10) * time.Minute)...
notzippy 2015年

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.