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