Maison > développement back-end > Golang > le corps du texte

Convertir les horodatages Chrome dans Go

WBOY
Libérer: 2024-02-06 11:03:03
avant
821 Les gens l'ont consulté

在 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>
Copier après la connexion

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
Copier après la connexion

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>
Copier après la connexion
-11644473600000000
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion
2024-01-23 12:43:59.099543 -0800 PST
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!