Heim > Backend-Entwicklung > Golang > Konvertieren Sie Chrome-Zeitstempel in Go

Konvertieren Sie Chrome-Zeitstempel in Go

WBOY
Freigeben: 2024-02-06 11:03:03
nach vorne
854 Leute haben es durchsucht

在 Go 中转换 Chrome 时间戳

Frageninhalt

Ich versuche, mit Go einen Zeitstempel aus einer lokalen Chrome-SQLite-Datenbank in die Ortszeit umzuwandeln. Ich weiß, dass diese Zeitstempel ab dem 01.01.1601 Mikrosekunden sind.

Wenn ich die Werte von lastVisitTime überprüfe, die ich im folgenden Programm auf dieser Chrome Timestamp Conversion-Website erhalte, scheine ich sie korrekt aus der Datenbank abzurufen.

<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>
Nach dem Login kopieren

Aber aus irgendeinem Grund .Add(d) stellt ich die Zeit auf 1601 ein, was ich noch nie zuvor gesehen habe.

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
Nach dem Login kopieren

Was ist hier los und was noch wichtiger ist: Wie mache ich das richtig?


Richtige Antwort


Dank Peters Kommentar, der auf den Überlauf in meinem ursprünglichen Code hingewiesen hat, habe ich einen anderen Ansatz gefunden.

Wenn Sie das Chrome-Startdatum in UnixMicro() konvertieren, erhalten Sie einen negativen Offset von der regulären Epochenzeit:

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

Fügen Sie diese zu den Datenbankwerten hinzu und konvertieren Sie sie in time.Unix() in Nanosekunden, um die korrekte UTC-Zeit zu erhalten:

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

Vollständiges Beispiel für die Umstellung auf Pacific Time:

<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>
Nach dem Login kopieren
2024-01-23 12:43:59.099543 -0800 PST
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonKonvertieren Sie Chrome-Zeitstempel in Go. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage