2013-12-08 11 views
18

Sto utilizzando SQLite Database Browser per leggere le informazioni da un database che contiene la cronologia di navigazione di Google Chrome. Il mio codice corrente che sto eseguendo nel pannello "Esegui SQL" assomiglia a questo:Qual è il formato dei timestamp di Chrome?

SELECT last_visit_time,url,title 
FROM urls 
WHERE url LIKE {PLACEHOLDER} AND title LIKE {PLACEHOLDER} 

La roba sulla linea "WHERE" è bloccata con {PLACEHOLDER} per ragioni di privacy. Ora, voglio renderlo tale che i dati restituiti nella colonna last_visit_time siano leggibili invece di un pasticcio confuso come 13029358986442901. Come faccio a fare questo e come posso convertire il timestamp di Chrome in un formato leggibile? Come faccio a ordinarli (le righe restituite) per last_visit_time?

risposta

27

La risposta è data in this question: "timestamp [Google Chrome] è formattato come il numero di microsecondi dal gennaio 1601"

Così, per esempio nel mio database storia del campione, la query

SELECT 
    datetime(visit_time/1000000 + (strftime('%s', '1601-01-01')), 'unixepoch') 
FROM visits 
ORDER BY visit_time DESC 
LIMIT 10; 

dà i risultati:

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 

Utilizzando il valore di timestamp di 13029358986442901:

SELECT 
    datetime(13029358986442901/1000000 + (strftime('%s', '1601-01-01')), 'unixepoch') 

il risultato è:

2013-11-19 18:23:06 
+0

Query regolata per gestire il fuso orario: 'datetime (last_visit_time/1000000 + (strftime ('% s', '1601-01-01T05: 30: 00')), 'unixepoch')' dove 'T05: 30: 00 'è il mio fuso orario. Sostituiscilo con il tuo. – matrix

1

Sono nuovo di codifica quindi non sono sicuro di come si fa con SQL, tuttavia posso mostrarvi un metodo in C#. Spero che questo possa aiutare qualcuno.

Se il valore tempo dato nel database è:
13029358986442901. selezionare solo le prime 11 cifre 13029358986. È possibile convertire questo alla volta utilizzando:

DateTime dateTimeVar = new DateTime(1601,1,1).AddSeconds(time); 

La risposta qui è stato: 19-11- 2013 18:23:06 E questo era senza la conversione del fuso orario.

+0

Invece di troncare tutte le cifre dopo l'11, puoi anche dividere il valore temporale per 1.000.000, il che ti dà comunque una data abbastanza precisa. – Bryida

5

visits.visit_time è in microsecondi dal 1 ° gennaio 1601 UTC che è simile ma non deve essere confuso con Windows filetime che è il numero di 100 nanosecondi dal 1 ° gennaio 1601 UTC.

Trivia: Perché 1601?
Penso che la risposta popolare sia perché il calendario gregoriano opera su un ciclo di 400 anni e 1601 è il primo anno del ciclo attivo al momento della progettazione di Windows NT. In altre parole, è stato scelto per far uscire bene la matematica. Il 1 gennaio 1601 è l'origine delle date intere di COBOL. È anche il giorno 1 dal formato data ANSI. E se si ipotizza ulteriormente in base allo ISO8601, che è il formato in cui si trova, ISO8601 funziona già nel 1581. Prima del 1583 il tempo era basato sul calendario prolettico gregoriano che ha 366 giorni all'anno. Forse hanno appena arrotondato al prossimo secolo.


downloads.start_time è il numero di secondi dal 1 gennaio 1970 UTC

Curiosità: Perché 1970?
Bene, sono contento che tu abbia chiesto .. Non era abituato .. Originariamente era il 1 gennaio 1971, ma fu successivamente arrotondato al 1 gennaio 1970. Il 1 gennaio 1970 è considerato la nascita di UNIX.

Vale la pena notare che Firefox formatta momento in cui il numero di microsecondi dal 1 gennaio 1970 ed il nome per il formato è PRTime

Tutti questi sono in un formato EPOCH ISO 8601.

+0

Fonte per "originariamente era il 1 gennaio 1971"? – Pacerier

+0

[Il Manuale del programmatore Unix 1st Edition definisce il tempo Unix come "il tempo dalle 00:00:00 del 1 gennaio 1971 misurato in sessantesimi di secondo".] (Http://stackoverflow.com/q/1090869/ 1922144) – davidcondrey

3

Chromes Timestap non è Unixepoch !!

L'ora di base di Chrome è 01/01/1601 00:00:00. Per calcolare l'ora locale, il tempo di Chrome deve essere convertito in secondi dividendo per un milione, quindi i sottratti di secondi tra 01/01/1601 00:00:00 e 01/01/1970 00:00:00 devono essere sottratti . Ci sono due modi per farlo, vale a dire SQLite stesso e Unix.

SQLITE:

sqlite> SELECT strftime('%s', '1601-01-01 00:00:00'); 
-11644473600 

DATA:

$ date +%s -d 'Jan 1 00:00:00 UTC 1601' 
-11644473600 

In entrambi i comandi sopra, il "% s" rappresenta il tempo unixepoch. I comandi calcolano il numero di secondi tra unixepoch time (1970) e la data successiva (Chrome time base, 1601). Si noti che i secondi sono negativi. Certo, questo è perché devi contare all'indietro dal 1970 al 1601! Con queste informazioni, siamo in grado di convertire il tempo Chrome in SQLite in questo modo:

sqlite> SELECT datetime((time/1000000)-11644473600, 'unixepoch', 'localtime') AS time FROM table; 

Buona lettura here.

Problemi correlati