시간 빼기 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
시간을 빼는 것은 어떻습니까?
Thomas Browne 2015

Sub시간을 뺍니다. 야!
Abhi

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.Hour또는 time.Second대신 사용할 수도 있습니다 time.Minute.

플레이 그라운드 : https://play.golang.org/p/DzzH4SA3izp


4
ParseDuration정적 값을 사용하지 마십시오 ! 그냥 사용하십시오 -10 * time.Minute. 그 상수가 정의 된 것입니다. 예를 들어 time.Now().Add(-10 * time.Minute)필요한 모든 것입니다.
Dave C

22
와, 시간 API가 너무 일관성이 없습니다. time.Add는 기간을 더하는 것이고, time.Sub는 시간을 빼는 것입니다. Sub 함수를보고 있었기 때문에이 답변을 찾았고 Add와 다른 서명이 있다고 생각하지 못했을 것입니다.
laurent

8
또한 go 는 기간에 int 값을 곱할 때 오류가 발생하는 경우 암시 적으로로 변환 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
이것이 질문 제목에 대한 정답이며 답으로 표시되어야합니다.
selalerer

0

거기에 time.ParseDuration행복, 부정적인 기간을 수락 할 매뉴얼에 따라 . 그렇지 않으면 처음에 정확한 기간을 얻을 수있는 기간을 부정 할 필요가 없습니다.

예를 들어 1 시간 반을 빼야 할 때 다음과 같이 할 수 있습니다.

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.