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

Mar*_*ers 91 go

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

我知道减法是可能的time.Sub()(它想要另一个time.Time),但这将导致a time.Duration,我需要它反过来.

小智 121

回应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)
}
Run Code Online (Sandbox Code Playgroud)

生产:

now: 2009-11-10 23:00:00 +0000 UTC
10 minutes ago: 2009-11-10 22:50:00 +0000 UTC
Run Code Online (Sandbox Code Playgroud)

更不用说,您也可以根据自己的需要使用time.Hourtime.Second代替time.Minute.

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

  • 哇,时间API是如此不一致.time.Add是添加持续时间,而time.Sub是减去时间.很高兴我找到了这个答案,因为我正在查看Sub函数,我绝不会猜到它与Add有不同的签名. (16认同)
  • 还要注意,go隐式地将`now.Add(-10*time.Minute)`转换为`now.Add(time.Duration(-10)*time.Minute)`以防万一你把一个持续时间乘以一个错误int值... (8认同)
  • 不要使用'ParseDuration`来获取静态值!只需使用`-10*time.Minute`,就是那些常量的定义.例如,只是`time.Now().添加(-10*time.Minute)`就是你所需要的. (3认同)

lnm*_*nmx 113

试试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)
}
Run Code Online (Sandbox Code Playgroud)

生产:

now: 2009-11-10 23:00:00 +0000 UTC
then: 2009-10-10 23:00:00 +0000 UTC
Run Code Online (Sandbox Code Playgroud)

游乐场:http://play.golang.org/p/QChq02kisT

  • 减去**时间**和减去**时间**是不同的运算。要减去**时间**,您可以调用 time.Now().Sub(time.Time{}) 以获取 Duration 形式的差值。要减去 **一段时间**,例如 1 分钟,您必须执行 time.Now().Add(**time.Minute * -1**)。Sub() 和 Add() 之间缺乏对称性令人恼火。 (29认同)
  • 减去时间怎么样? (27认同)
  • Diff() 或类似的方法对于计算持续时间来说是比当前的 Add/Sub 混淆更直观的替代方案...... (2认同)

doc*_*hat 40

你可以否定一个time.Duration:

then := now.Add(- dur)
Run Code Online (Sandbox Code Playgroud)

你甚至可以比较time.Duration反对0:

if dur > 0 {
    dur = - dur
}

then := now.Add(dur)
Run Code Online (Sandbox Code Playgroud)

您可以在http://play.golang.org/p/ml7svlL4eW上看到一个有效的例子

  • 虽然有一个问题:`-1*dur`会起作用,但是`d:= -1; dur = d*dur`将生成错误:"不匹配的类型int和time.Duration" (2认同)
  • 这是问题标题的正确答案,应将其标记为答案。 (2认同)

san*_*mai 6

根据手册,它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)
}
Run Code Online (Sandbox Code Playgroud)

https://play.golang.org/p/63p-T9uFcZo