Maison >développement back-end >Golang >Convertir les horodatages Chrome dans Go
J'essaie de convertir un horodatage d'une base de données Chrome SQLite locale en heure locale à l'aide de Go. Je sais que ces horodatages sont en microsecondes à partir du 1601/01/01.
En vérifiant les valeurs de lastVisitTime
que j'obtiens dans le programme suivant sur ce site Web Chrome Timestamp Conversion, il me semble que je les récupère correctement de la base de données.
<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>
Mais pour une raison quelconque, le mien .Add(d)
règle l'heure sur 1601, ce que je n'ai jamais vu auparavant.
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
Que se passe-t-il ici, et plus important encore, comment puis-je procéder correctement ?
Grâce au Commentaire de Peter qui soulignait le débordement dans mon code d'origine, j'ai trouvé une approche différente.
Si vous convertissez la date de début de Chrome en UnixMicro()
, vous obtenez un décalage négatif par rapport à l'heure normale :
<code>chromeMicroOffset := time.Date(1601, 1, 1, 0, 0, 0, 0, time.UTC).UnixMicro() fmt.Println(chromeMicroOffset) </code>
-11644473600000000
Ajoutez-les aux valeurs de la base de données et convertissez-les en nanosecondes en time.Unix()
pour obtenir l'heure UTC correcte :
<code>microFromEpoch := chromeMicroOffset + lastVisitTime t := time.Unix(0, microFromEpoch*1000) </code>
Exemple complet de conversion à l'heure du Pacifique :
<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
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!