最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • 在 Go 中转换 Chrome 时间戳

    在 go 中转换 chrome 时间戳

    问题内容

    我正在尝试使用 Go 将时间戳从本地 Chrome sqlite 数据库转换为本地时间。我知道这些时间戳是从 1601/01/01 开始的微秒。

    检查我在此 Chrome 时间戳转换网站上的以下程序中获取的 lastVisitTime 的值,我似乎正在从数据库中正确检索它们。

    <code>package main
    
    import (
        "database/sql"
        "fmt"
        "time"
    
        _ "github.com/mattn/go-sqlite3"
    
        "github.com/local_library/comp"
    )
    
    var (
        dbPath           = comp.Expanduser("~/Library/Application Support/Google/Chrome/Default/History")
        chromeEpochStart = time.Date(1601, 1, 1, 0, 0, 0, 0, time.UTC)
    )
    
    const (
        driverName = "sqlite3"
        tmpPath    = "/tmp/History"
        query      = `
    SELECT
        last_visit_time
    FROM 
        urls
    ORDER BY
        last_visit_time DESC
    LIMIT 5
    `
    )
    
    func main() {
        // Copy to tmp to unlock
        err := comp.Copy(dbPath, tmpPath)
        comp.MustBeNil(err)
    
        db, err := sql.Open(driverName, tmpPath)
        comp.MustBeNil(err)
        rows, err := db.Query(query)
        comp.MustBeNil(err)
        for rows.Next() {
            var lastVisitTime int64
            rows.Scan(&lastVisitTime)
            d := time.Duration(time.Microsecond * time.Duration(lastVisitTime))
            t := chromeEpochStart.Add(d)
            fmt.Println(t, lastVisitTime)
        }
    
        err = rows.Close()
        comp.MustBeNil(err)
        err = rows.Err()
        comp.MustBeNil(err)
    }
    </code>

    但由于某种原因,我的 .Add(d) 将时间设置为 1601 之前,这是我以前从未见过的。

    1439-07-05 20:00:21.462742384 +0000 UTC 13350512095172294
    1439-07-05 19:58:20.377916384 +0000 UTC 13350511974087468
    1439-07-05 19:57:58.539932384 +0000 UTC 13350511952249484
    1439-07-05 19:57:48.539540384 +0000 UTC 13350511942249092
    1439-07-05 19:52:09.587445384 +0000 UTC 13350511603296997

    这里发生了什么,更重要的是,我该如何正确执行此操作?

    正确答案

    感谢 Peter 的评论指出了我原始代码中的溢出,我找到了一种不同的方法。

    如果将 Chrome 开始日期转换为 UnixMicro(),则会得到与常规纪元时间的负偏移量:

    <code>chromeMicroOffset := time.Date(1601, 1, 1, 0, 0, 0, 0, time.UTC).UnixMicro()
    fmt.Println(chromeMicroOffset)
    </code>
    -11644473600000000

    将这些添加到数据库值中,并在 time.Unix() 中将它们转换为纳秒,即可获得正确的 UTC 时间:

    <code>microFromEpoch := chromeMicroOffset + lastVisitTime
    t := time.Unix(0, microFromEpoch*1000)
    </code>

    转换为太平洋时间的完整示例:

    <code>package main
    
    import (
        "fmt"
        "time"
    )
    
    var (
        chromeMicroOffset = time.Date(1601, 1, 1, 0, 0, 0, 0, time.UTC).UnixMicro()
    )
    
    func main() {
        chromeTimestamp := int64(13350516239099543)
    
        microFromEpoch := chromeMicroOffset + chromeTimestamp
        t := time.Unix(0, microFromEpoch*1000)
        loc, err := time.LoadLocation("America/Los_Angeles")
        if err != nil {
            panic(err)
        }
        fmt.Println(t.In(loc))
    }
    </code>
    2024-01-23 12:43:59.099543 -0800 PST
    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » 在 Go 中转换 Chrome 时间戳
    • 7会员总数(位)
    • 25846资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 293稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情