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

Konvertieren Sie Chrome-Zeitstempel in Go

WBOY
WBOYnach vorne
2024-02-06 11:03:03801Durchsuche

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

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

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

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>

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

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen