Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Tukar cap masa Chrome dalam Go

Tukar cap masa Chrome dalam Go

WBOY
WBOYke hadapan
2024-02-06 11:03:03801semak imbas

在 Go 中转换 Chrome 时间戳

Kandungan soalan

Saya cuba menukar cap masa daripada pangkalan data sqlite Chrome tempatan kepada waktu tempatan menggunakan Go. Saya tahu cap masa ini ialah mikrosaat bermula dari 1601/01/01.

Menyemak nilai lastVisitTime yang saya peroleh dalam program berikut di tapak web Penukaran Cap Waktu Chrome ini, saya nampaknya mengambilnya daripada pangkalan data dengan betul.

<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>

Tetapi atas sebab tertentu saya .Add(d) menetapkan masa kepada 1601, yang saya tidak pernah lihat sebelum ini.

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

Apa yang berlaku di sini, dan yang lebih penting, bagaimanakah saya melakukan ini dengan betul?


Jawapan betul


Terima kasih kepada komen Peter yang menunjukkan limpahan dalam kod asal saya, saya mendapati pendekatan yang berbeza.

Jika anda menukar tarikh mula Chrome kepada UnixMicro(), anda mendapat offset negatif daripada masa zaman biasa:

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

Tambahkan ini pada nilai pangkalan data dan tukarkannya kepada nanosaat dalam time.Unix() untuk mendapatkan masa UTC yang betul:

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

Contoh penuh penukaran kepada Waktu Pasifik:

<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

Atas ialah kandungan terperinci Tukar cap masa Chrome dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam