从 UnixNano() 到 Time{}

问题描述 投票:0回答:2

我想将 UnixNano() int64 时间戳转换回 time.Time{}

退一步,这是一个更大的问题。

我们有一个带有时间戳的数据库,我们使用这些时间戳来提取条目。在纳米时间内不应该有重复的时间戳。该数据库是一个嵌入式 SQLite3 数据库(通过“github.com/mattn/go-sqlite3”驱动程序),其标记保存在 INTEGER 列中。我们以选择子句的形式并在几个视图内对数字值进行一些排序和过滤。

因此,当我们将整数绑定到准备好的语句时,例如:

INSERT INTO "event" ("timestamp", "command", "data") VALUES (?, ?, ?)

我们绑定 time.Now().UnixNano()。

但是,当我尝试将项目转换为数据结构时,我发现我无法准确地获取 UnixNano 时间并将其重新构造回 time.Time{} 结构。

他们从不匹配。

我该怎么做?

go sqlite
2个回答
33
投票
t1 := time.Now()
fmt.Println(t1, t1.UnixNano())
t2 := time.Unix(0, t1.UnixNano())
fmt.Println(t2, t2.UnixNano())

给你

2009-11-10 23:00:00 +0000 UTC 1257894000000000000
2009-11-10 23:00:00 +0000 UTC 1257894000000000000

http://play.golang.org/p/Q68IaR9zPK

顺便说一句,您确定保存到数据库的整数值没有被截断(例如可以存储 int64)?


0
投票
func main() {
    t1 := time.Now()
    fmt.Println(t1, t1.UnixNano())
    ns := t1.UnixNano()
    t2 := time.Unix(0, ns)  // <------- parse the int64 created by t.UnixNano()
    fmt.Println(t2, t2.UnixNano())
}

我猜 time.UnixNano() 解析由 t.UnixNano() 创建的 int64 不存在,因为 time.Unix(sec int64, nsec int64) Time 存在。

在 Ubuntu 22.04 上使用 Go 1.21 的结果:

2024-01-22 21:43:30.52613572 +0100 CET m=+0.000014357 1705956210526135720
2024-01-22 21:43:30.52613572 +0100 CET 1705956210526135720
© www.soinside.com 2019 - 2024. All rights reserved.