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