Віднімання часу. Зростання часу в Го


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 працює лише для віднімання дати, ось модифікація його коду, яка працює для віднімання часу від типу 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)це все, що вам знадобиться.
Дейв C

22
Нічого собі, API API настільки непостійний. time.Add - додати тривалість, а time.Sub - підрегулювати час. Радий, що знайшов цю відповідь, тому що я дивився на функцію Sub, і ніколи не здогадався б, що вона має інший підпис від Add.
Лоран

8
Також зауважте, що перехід неявно перетворюється now.Add(-10 * time.Minute)на той now.Add(time.Duration(-10) * time.Minute)випадок, якщо ви отримуєте помилку при множенні тривалості на значення int ...
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задоволенням приймуть негативні терміни, відповідно до інструкції . Інакше кажучи, не потрібно нівелювати тривалість, коли ви в першу чергу можете отримати точну тривалість.

Напр., Коли вам потрібно буде резюмувати годину-півтори, ви можете це зробити так:

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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.