比较两个日期而不考虑时间的差异

4

我有两个日期,我只想比较日期,忽略时间。目前我的代码如下:

package main

import (
    "time"
    //"fmt"
)

func main() {
    a, _ := time.Parse(time.RFC3339, "2017-02-01T12:00:00+00:00")
    b, _ := time.Parse(time.RFC3339, "2017-02-11T14:30:00+00:00")

    x := b.Sub(a)

    println(int(x.Hours()))
}

这将打印出242。虽然是正确的,但我实际上想要做的是像这样比较日期:

    a, _ := time.Parse(time.RFC3339, "2017-02-01T00:00:00+00:00")
    b, _ := time.Parse(time.RFC3339, "2017-02-11T00:00:00+00:00")

注意: 分钟 / 小时 / 秒已设置为零 - 差异现在将为240小时。

我真的无法弄清楚如何做到这一点,Go中是否有time.SetTime(0, 0, 0)函数,还是重置日期时间的规范方法是什么?


你是否仍然想要考虑时区?例如,2017-01-01T22:00:00+00:002017-01-02T02:00:00+04:00是同一时刻,但使用不同的时区进行描述。 - Addison
这是一个很好的问题,我处理的日期都假定为UTC,所以并没有太大关系。但如果它们有不同的时区,我就需要考虑到这一点。 - Max
好的,那么在这种情况下,eugenioy的答案似乎已经涵盖了。顺便提一下,他们的答案确实考虑了时区,所以我提到的那两个日期将被视为同一天,因此相差0小时。 - Addison
2个回答

4
你可以使用Truncate方法将时间戳截断为一天的倍数,从而实现时间的四舍五入。
以你的示例为例:
oneDay := 24 * time.Hour
a = a.Truncate(oneDay)
b = b.Truncate(oneDay)

在这里找到使用了适配代码的游乐场:https://play.golang.org/p/yWIYt3UkiT


好的,我知道了。我之前已经阅读过API文档,但不确定Truncate方法该如何使用。我会尝试一下,谢谢。 - Max

0

如果使用time.Time处理日期,必须非常小心,因为在夏令时的开始和结束周围可能存在边缘情况。

不要介意我自己的宣传:我编写了一个日期包(实际上是从其他人的早期工作中派生出来的),以处理日期而不会遇到DST问题。

https://github.com/rickb777/date

你可以做,例如,

a := date.New(2017, 2, 1)
b := date.New(2017, 2, 11)
daysDifference := b.Sub(a)
fmt.Println(daysDifference)

还有其他的子包可以处理日期范围、时间跨度、ISO8601时段和钟面时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接