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

在 Go 中轉換 Chrome 時間戳

WBOY
WBOY轉載
2024-02-06 11:03:03846瀏覽

在 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刪除