首頁 > 後端開發 > Golang > 在 Go 中轉換 Chrome 時間戳

在 Go 中轉換 Chrome 時間戳

WBOY
發布: 2024-02-06 11:03:03
轉載
853 人瀏覽過

在 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
登入後複製

以上是在 Go 中轉換 Chrome 時間戳的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板