J'utilise SQLite Database Browser pour lire les informations d'une base de données contenant l'historique de navigation de Google Chrome. Mon code actuel que j'exécute dans le panneau "Exécuter SQL" ressemble à ceci:
SELECT last_visit_time,url,title
FROM urls
WHERE url LIKE {PLACEHOLDER} AND title LIKE {PLACEHOLDER}
Les éléments de la ligne "WHERE" sont bloqués avec {PLACEHOLDER}
à des fins de confidentialité. Maintenant, je veux faire en sorte que les données retournées dans la colonne last_visit_time
soient lisibles au lieu d’un désordre confus comme 13029358986442901
. Comment faire cela et comment convertir l'horodatage de Chrome en un format lisible? Comment l'obtenir pour les commander (les lignes retournées) par last_visit_time
?
La réponse est donnée dans cette question : "L'horodatage de [Google Chrome] est formaté en tant que nombre de microsecondes depuis janvier 1601"
Ainsi, par exemple, dans mon exemple de base de données d’historique, la requête
SELECT
datetime(visit_time / 1000000 + (strftime('%s', '1601-01-01')), 'unixepoch')
FROM visits
ORDER BY visit_time DESC
LIMIT 10;
donne les résultats:
2014-09-29 14:22:59
2014-09-29 14:21:57
2014-09-29 14:21:53
2014-09-29 14:21:50
2014-09-29 14:21:32
2014-09-29 14:21:31
2014-09-29 14:16:32
2014-09-29 14:16:29
2014-09-29 14:15:05
2014-09-29 14:15:05
En utilisant votre valeur d'horodatage de 13029358986442901:
SELECT
datetime(13029358986442901 / 1000000 + (strftime('%s', '1601-01-01')), 'unixepoch')
le résultat est:
2013-11-19 18:23:06
visits.visit_time
est en microsecondes depuis le 1er janvier 1601 UTC, ce qui est similaire mais ne doit pas être confondu avec Windows filetime, qui correspond au nombre de 100 nanosecondes depuis le 1er janvier 1601 UTC.
Anecdote: Pourquoi 1601?
Je pense que la réponse populaire est que le calendrier grégorien fonctionne sur un cycle de 400 ans et que 1601 est la première année du cycle qui était actif au moment de la conception de Windows NT. En d'autres termes, il a été choisi pour que les calculs soient bien faits. Le 1 janvier 1601 est l’origine des dates entières COBOL. C'est aussi le jour 1 selon le format de date ANSI. Et si vous spéculez davantage selon ISO8601 , qui est le format dans lequel elle se trouve, ISO8601 fonctionne dès l'année 1581. Avant 1583, le calendrier proleptique était basé sur le calendrier grégorien, qui compte 366 jours par an. Peut-être qu’ils viennent d’être arrondis au siècle prochain.
downloads.start_time
est le nombre de secondes depuis le 1er janvier 1970 UTC
Trivia: Pourquoi 1970?
Eh bien, je suis heureux que vous ayez posé la question. Cela n’était pas le cas auparavant. C’était le 1 er janvier 1971, mais il a été arrondi au 1 er janvier 1970. Le 1 er janvier 1970 est considéré comme la naissance d’UNIX.
Il est intéressant de noter que Firefox formate le temps en tant que nombre de microsecondes depuis le 1er janvier 1970 et que le nom du format est PRTime
Tous sont au format ISO 8601 Epoch.
Chromes Timestap n'est pas Unixepoch !!
Le temps de base de Chrome est le 01/01/1601 00:00:00. Pour calculer l'heure locale, il faut convertir le temps de Chrome en secondes en le divisant par un million, puis soustraire le différentiel de secondes entre 01/01/1601 00:00:00 et 01/01/1970 . Vous pouvez le faire de deux manières, à savoir SQLite et Unix.
SQLITE:
sqlite> SELECT strftime('%s', '1601-01-01 00:00:00');
-11644473600
RENDEZ-VOUS AMOUREUX:
$ date +%s -d 'Jan 1 00:00:00 UTC 1601'
-11644473600
Dans les deux commandes ci-dessus, le "% s" représente le temps unixepoch. Les commandes calculent le nombre de secondes entre l'heure unixepoch (1970) et la date suivante (base de temps Chrome, 1601). Notez que les secondes sont négatives. Bien sûr, c'est parce que vous devez compter à rebours de 1970 à 1601! Avec cette information, nous pouvons convertir le temps de Chrome dans SQLite comme ceci:
sqlite> SELECT datetime((time/1000000)-11644473600, 'unixepoch', 'localtime') AS time FROM table;
Bonne lecture ici .
Je suis nouveau dans la programmation, je ne sais donc pas comment procéder avec SQL, mais je peux vous montrer une méthode en c #. J'espère que cela aiderait quelqu'un.
Si la valeur de temps donnée dans la base de données est:
13029358986442901. Sélectionnez uniquement les 11 premiers chiffres 13029358986. Vous pouvez convertir ceci en heure en utilisant:
DateTime dateTimeVar = new DateTime(1601,1,1).AddSeconds(time);
La réponse était: 19-11-2013 18:23:06 .__ Et ce fut sans la conversion de votre fuseau horaire.
Vous pouvez soustraire 11644473600000 (le 1/1/1601 est -11644473600000 en unixepoch) et le traiter comme un horodatage de période Unix régulier supposant des millisecondes.
milis: 11644473600000 secondes: 11644473600
Voici une expression compacte pour convertir WebKit Time:
sqlite> SELECT datetime(time/1e6-11644473600,'unixepoch','localtime') AS time FROM table;