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

Tukar cap masa Chrome dalam Go

WBOY
Lepaskan: 2024-02-06 11:03:03
ke hadapan
855 orang telah melayarinya

在 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>
Salin selepas log masuk

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
Salin selepas log masuk

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>
Salin selepas log masuk
-11644473600000000
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk
2024-01-23 12:43:59.099543 -0800 PST
Salin selepas log masuk

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

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan