登录
首页 >  Golang >  Go问答

在 time.Now() 到达时执行重复操作

来源:stackoverflow

时间:2024-03-26 12:15:35 141浏览 收藏

在 Go 语言中,可以利用时间变量在 for 循环中递增日期,直到达到当前日期。使用 `time.After()` 函数比较时间点,并根据 `day()` 函数判断是否相等,从而精确确定何时停止循环。通过这种方式,可以遍历指定开始日期与当前日期之间的所有日期,并执行相应的操作。

问题内容

golang 中是否可以通过给定的日期变量在 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 打印出所有日期(带有时间等),直到达到当前日期


解决方案


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

func (t 时间) 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 之后。 before 报告时刻 t 是否在 u 之前。

所以@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

正确设置循环条件并..

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

终于介绍完啦!小伙伴们,这篇关于《在 time.Now() 到达时执行重复操作》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>