Trừ thời gian. Độ bão hòa theo thời gian trong Go


104

Tôi có một time.Timegiá trị thu được từ đó time.Now()và tôi muốn lấy một thời điểm khác cách đây đúng 1 tháng.

Tôi biết là có thể trừ với time.Sub()(mà muốn khác time.Time), nhưng điều đó sẽ dẫn đến a time.Durationvà tôi cần nó theo cách khác.

Câu trả lời:


123

Hãy thử 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)
}

Sản xuất:

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

Sân chơi: http://play.golang.org/p/QChq02kisT


33
những gì về trừ một thời gian?
Thomas Browne

Subđể trừ thời gian. Tât nhiên!
Abhi

139

Theo nhận xét của Thomas Browne, vì câu trả lời của lnmx chỉ hoạt động để trừ ngày, đây là một sửa đổi mã của anh ấy có tác dụng trừ thời gian cho một loại thời gian.

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

Sản xuất:

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

Chưa kể, bạn cũng có thể sử dụng time.Hourhoặc time.Secondthay thế time.Minutetùy theo nhu cầu của mình.

Sân chơi: https://play.golang.org/p/DzzH4SA3izp


4
Không sử dụng ParseDurationcho các giá trị tĩnh! Chỉ cần sử dụng -10 * time.Minute, đó là những gì các hằng số đó được định nghĩa. Ví dụ: chỉ time.Now().Add(-10 * time.Minute)là tất cả những gì bạn cần.
Dave C

22
Chà, API thời gian không nhất quán. time.Add là để thêm một khoảng thời gian, trong khi time.Sub là để rút ngắn thời gian. Rất vui vì tôi đã tìm thấy câu trả lời này vì tôi đang xem hàm Sub và tôi sẽ không bao giờ đoán được nó có chữ ký khác với Add.
laurent

8
Cũng lưu ý rằng đi ngầm cải now.Add(-10 * time.Minute)để now.Add(time.Duration(-10) * time.Minute)trong trường hợp nhận được của bạn một lỗi khi nhân một thời gian bởi một giá trị int ...
notzippy

51

Bạn có thể phủ định một time.Duration:

then := now.Add(- dur)

Bạn thậm chí có thể so sánh time.Durationvới 0:

if dur > 0 {
    dur = - dur
}

then := now.Add(dur)

Bạn có thể xem một ví dụ hoạt động tại http://play.golang.org/p/ml7svlL4eW


2
Có một bắt mặc dù: -1 * dursẽ làm việc, nhưng d := -1 ; dur = d * dursẽ tạo ra một lỗi: "không phù hợp loại int và time.Duration"
BlakBat

4
Đó là câu trả lời đúng cho tiêu đề của câu hỏi và nó phải được đánh dấu là câu trả lời.
selalerer

0

time.ParseDurationđiều đó sẽ vui vẻ chấp nhận thời lượng âm, theo hướng dẫn . Nói cách khác, không cần phải phủ định thời lượng mà bạn có thể nhận được thời lượng chính xác ngay từ đầu.

Ví dụ: khi bạn cần rút ngắn một tiếng rưỡi, bạn có thể làm như vậy:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.