在time.Now()到达时进行循环

时间:2019-01-10 15:49:53

标签: go

在Golang中是否可以通过给定的date变量将for循环中的日期递增,直到达到当前日期/时间。Now()

// Start date
t, _ := time.Parse(time.RFC3339, "2018-07-19T12:25:10.8584224+02:00")

// Current date
ct := time.Now()

for d := t; d.Day() == ct.Day(); d = d.AddDate(0, 0, 1) {
    // Print all days between start date and current date 
    fmt.Println(d)
}

我希望变量d可以打印出所有日期(包括时间等),直到达到当前日期为止

4 个答案:

答案 0 :(得分:1)

正确设置循环条件。

package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Println("Hello, playground")
    t, _ := time.Parse(time.RFC3339, "2018-07-19T12:25:10.8584224+02:00")

    // Current date
    ct := time.Now()

    for d := t; d.Day() >= ct.Day(); d = d.AddDate(0, 0, 1) {
        // Print all days between start date and current date
        fmt.Println(d)
    }
}

Hello, playground
2018-07-19 12:25:10.8584224 +0200 +0200
2018-07-20 12:25:10.8584224 +0200 +0200
2018-07-21 12:25:10.8584224 +0200 +0200
2018-07-22 12:25:10.8584224 +0200 +0200
2018-07-23 12:25:10.8584224 +0200 +0200
2018-07-24 12:25:10.8584224 +0200 +0200
2018-07-25 12:25:10.8584224 +0200 +0200
2018-07-26 12:25:10.8584224 +0200 +0200
2018-07-27 12:25:10.8584224 +0200 +0200
2018-07-28 12:25:10.8584224 +0200 +0200
2018-07-29 12:25:10.8584224 +0200 +0200
2018-07-30 12:25:10.8584224 +0200 +0200
2018-07-31 12:25:10.8584224 +0200 +0200

https://play.golang.org/p/yRBTUZKfseG

答案 1 :(得分:0)

根据您的评论,您需要实际将其告知Format日期,以表示有价值:

package main

import (
    "fmt"
    "log"
    "time"
)

func main() {
    start, err := time.Parse("2006-1-2", "2018-1-1")
    if err != nil {
        log.Fatal(err)
    }

    for d := start; d.Month() == start.Month(); d = d.AddDate(0, 0, 1) {
        fmt.Println(d.Format("2006-1-2"))
    }
}

这是您的代码的简单版本(我使用了自定义时间格式,因为我不想编辑RFC语法,但最终是同一回事)=为了简洁起见,我还在迭代Month。

答案 2 :(得分:0)

package main

import (
    "fmt"
    "time"
)

func main() {
    t, _ := time.Parse(time.RFC3339, "2018-07-19T12:25:10.8584224+02:00")

    ct := time.Now()

    for t.Before(ct) {
        fmt.Println(t)
        t.AddDate(0, 0, 1)
    }
}

答案 3 :(得分:0)

根据godoc:https://golang.org/pkg/time/#Time.Day

func (t Time) Day() int

Day返回t指定的月份。

因此,比较d.Day()和ct.Day()不是正确的方法。如果今天是“ 2019-01-01”,而您的开始时间是“ 2018-12-23”怎么办?

比较两个时间的正确方法。时间是https://golang.org/pkg/time/#Time.After

func (t Time) After(u Time) bool
func (t Time) Before(u Time) bool

After报告时刻t是否在u之后。 之前报告时间t是否早于你。

因此@Alex Pliutau的解决方案更加常用。但是今天需要更加小心。

package main

import (
    "fmt"
    "time"
)

func main() {
    t, _ := time.Parse(time.RFC3339, "2009-11-02T12:25:10.8584224+02:00")

    // truncate to 0:0:0
    t = t.Truncate(24 * time.Hour)
    fmt.Println("start time is:", t)

    // Current date truncate to 0:0:0
    ct := time.Now().Truncate(24 * time.Hour)
    fmt.Println("now is:", ct)
    fmt.Println("---------------")

    // for t.Before(ct) {  //if you don't want to print the date of today
    for !t.After(ct) {
        // Print all days between start date and current date
        fmt.Println(t.Format("2006-01-02 15:04:05"))
        t = t.AddDate(0, 0, 1)
    }
}

输出:

start time is: 2009-11-02 02:00:00 +0200 +0200
now is: 2009-11-10 00:00:00 +0000 UTC
---------------
2009-11-02 02:00:00
2009-11-03 02:00:00
2009-11-04 02:00:00
2009-11-05 02:00:00
2009-11-06 02:00:00
2009-11-07 02:00:00
2009-11-08 02:00:00
2009-11-09 02:00:00
2009-11-10 02:00:00

https://play.golang.org/p/iMr7M5W9K4N