Maison  >  Article  >  développement back-end  >  Convertir les horodatages Chrome dans Go

Convertir les horodatages Chrome dans Go

WBOY
WBOYavant
2024-02-06 11:03:03801parcourir

在 Go 中转换 Chrome 时间戳

Contenu de la question

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 ?


Bonne réponse


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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer