Datetime 返回本地当日开始时间对象

Datetime 返回本地当日开始时间对象,datetime,go,Datetime,Go,为了得到一个本地的今天开始时间对象,我提取YMD并重建新的日期。那看起来像是一堆乱七八糟的东西。我是否错过了其他一些标准库函数 代码也可在以下位置运行: 编辑:这只适用于UTC时间(它是在操场上测试的,所以特定位置的测试可能是错误的)。有关此解决方案在特定位置场景中的问题,请参见PeterSO的答案 您可以在日期使用,24*time.Hour作为持续时间: 要添加一些解释,它之所以有效,是因为截断自零时间起指定持续时间的“舍入倍数”,零时间为1年1月1日00:00:00。因此,截断到最近的24

为了得到一个本地的今天开始时间对象,我提取YMD并重建新的日期。那看起来像是一堆乱七八糟的东西。我是否错过了其他一些标准库函数

代码也可在以下位置运行:


编辑:这只适用于UTC时间(它是在操场上测试的,所以特定位置的测试可能是错误的)。有关此解决方案在特定位置场景中的问题,请参见PeterSO的答案

您可以在日期使用,
24*time.Hour
作为持续时间:


要添加一些解释,它之所以有效,是因为截断自零时间起指定持续时间的“舍入倍数”,零时间为1年1月1日00:00:00。因此,截断到最近的24小时边界总是返回一个“一天的开始”。

问题的标题和文本都是关于“今天的当地[芝加哥]开始时间”。问题中的
Bod
函数正确地做到了这一点。该方法声称是一个更好的解决方案,但它返回了不同的结果;从今天开始,它不会返回本地[芝加哥]时间。比如说,

package main

import (
    "fmt"
    "time"
)

func Bod(t time.Time) time.Time {
    year, month, day := t.Date()
    return time.Date(year, month, day, 0, 0, 0, 0, t.Location())
}

func Truncate(t time.Time) time.Time {
    return t.Truncate(24 * time.Hour)
}

func main() {
    chicago, err := time.LoadLocation("America/Chicago")
    if err != nil {
        fmt.Println(err)
        return
    }
    now := time.Now().In(chicago)
    fmt.Println(Bod(now))
    fmt.Println(Truncate(now))
}
输出:

2014-08-11 00:00:00 -0400 EDT
2014-08-11 20:00:00 -0400 EDT
time.Truncate
方法截断UTC时间


还假定一天中有24小时。芝加哥每天有23、24或25个小时。

LGTM。这是正确的方法。@Stephen Weinberg觉得日期边界可能是date()函数的临时结果,我想知道是否有其他函数快捷键可以重新组装。好吧,那么…@VladDidenko:他们没有按你的要求做。详见我的答案。注意,这在运动场上运行不正常,因为他们的时钟设置为2009年11月。这是一个巧妙的小把戏。一定要把这个放到我的代码段库中!:)@普尔基托比奥,谢谢你,这就是我一直在寻找的东西:)我没有把它标记为一个答案,只是为了避免人们使用它,直到截断行为澄清。在我看来,@peterSO提到的行为是错误的。我已经复制了它,并将提交一个问题-要么它需要更多的文档,要么它是一个直截了当的bug。它在
Truncate()
doc中声明,计算是“从零开始”执行的,在
time
type docs中声明“type time的零值是1月1日,第1年,00:00:00.000000000 UTC”。起初,结果似乎不直观,但如文档所述:感谢您显示此函数,我不知道它,但目前的答案似乎并不适用。应用truncate本身就很有趣,值得举例和关注。一些例子:有趣的是,我不确定它是否只适用于UTC时间,这就是为什么我添加了一个特定于位置的测试,但我没有进一步测试。很高兴知道,你应该接受彼得索的回答。我看了很多例子,似乎看不到23、24、25小时的问题。由于它是以UTC计算的,UTC没有夏令时,因此似乎可以缓解这个问题。2014年3月9日凌晨2点,我在这里发布了一些关于CDT开始的示例:谢谢Peter,我被在操场上快速测试特定位置的时间愚弄了。但是,关于一天中的小时数(假设你说的是闰秒?),time.time值不会代表一天中的25小时,它会滚动到第二天,因此在这方面,24*time.Hour截断应该是可以的。一个生成示例输出并在Golang游乐场运行的代码示例发布在。我也编辑了这个答案,以反映它被接受了-但是编辑在评论中不知何故被卡住了。彼得,如果你有机会看一下并接受/拒绝它?
package main

import (
    "fmt"
    "time"
)

func Bod(t time.Time) time.Time {
    year, month, day := t.Date()
    return time.Date(year, month, day, 0, 0, 0, 0, t.Location())
}

func Truncate(t time.Time) time.Time {
    return t.Truncate(24 * time.Hour)
}

func main() {
    chicago, err := time.LoadLocation("America/Chicago")
    if err != nil {
        fmt.Println(err)
        return
    }
    now := time.Now().In(chicago)
    fmt.Println(Bod(now))
    fmt.Println(Truncate(now))
}
2014-08-11 00:00:00 -0400 EDT
2014-08-11 20:00:00 -0400 EDT