2012-05-24 8 views
10

Anche se questa non è una domanda di programmazione di per sé, è correlata.Analisi del campo "data" del file SMS di iPhone dal backup

Quindi sto cercando di capire come analizzare il DB SMS che viene eseguito il backup da iPhone. Sto osservando la tabella "messaggi", in particolare il campo "data". Ho notato che i messaggi più recenti utilizzano un diverso sistema di numerazione per indicare la data/l'ora. L'ho ristretto a passare a iMessage, in quanto ho un messaggio inviato a 1318470904, con una risposta inviata a 340164736. So per certo che questi messaggi sono stati inviati a meno di un'ora di distanza, eppure stanno indicando> 30 anni di differenza.

Qualcuno sa come calcolare con precisione la data utilizzando questo sistema più recente? Sta usando un'epoca diversa o ci sono dei pazzi matematici che devo fare?

Modifica: anche i messaggi recenti sono interessati. I testi (bolle verdi) vengono memorizzati con la data impostata normalmente e qualsiasi cosa tramite iMessage (bolle blu) viene memorizzato con la diversa rappresentazione della data.

+0

Jailbroken, sì? – GoZoner

+0

No, non è jailbroken, né lo era al momento dei messaggi. Sto ricevendo le informazioni dal file 3d0d ... nella directory di backup di iPhone. –

risposta

7

È in secondi dall'1/1/2001 anziché gli altri che sono basati su Unix 1/1/1970. Quindi per convertirlo in un tempo di Excel la tua formula sarebbe = Cell/(60 * 60 * 24) + "1/1/2001".

0

Potrebbe esserci un'altra risposta.

=Cell/(60*60*24) + "1/1/1970"

lavori con la mia attuale versione di iPhone/iOS => 4.3.3

0

Fomurla con il tempo di messaggi: = cellulare/(60 * 60 * 24) + "1/1/2001 07:00"

12

Dal momento che il backup viene esportato in formato di database SQLite, ecco come fare per convertire il numero per un vero appuntamento in SQLite:

select 
    datetime(date + strftime('%s', '2001-01-01 00:00:00'), 
     'unixepoch', 'localtime') as date, 
    * 
from message 
0

Apple utilizza Mac Absolute Time (MacTime). Questo è contato dal 01-01-2001. L'altro timestamp che vedi è UnixTime. Questo inizia dal 01-01-1970.

È necessario aggiungere 31 anni a MacTime per ottenere UnixTime. Questo è un PHP-snippit:

$macTime = $d['ZMESSAGEDATE']; // MacTime column (from Whatsapp) 
$unixTime = $macTime + 978307200; 
echo date("Y-m-d H:i:s", $unixTime); 

La differenza di tempo è calcolato utilizzando questo sito: https://www.timeanddate.com/date/durationresult.html?d1=1&m1=1&y1=1970&d2=1&m2=1&y2=2001&h1=0&i1=0&s1=0&h2=0&i2=0&s2=0

0

Bohemian ♦ è giusto, ma c'è un piccolo errore di battitura nella sua risposta:

uso% S (maiuscole) anziché% s, poiché il tempo è rappresentato in secondi dal 2001 e non dal 1970!

Doc da https://www.sqlite.org/lang_datefunc.html

%s  seconds since 1970-01-01 
%S  seconds: 00-59 

selezionare datetime (data + strftime ('% S', '2001-01-01 00:00:00'), 'unixepoch', 'localtime ') come data, * dal messaggio

+1

ha appena provato l'esempio nella query SQLite e fornisce risultati non corretti con "% S", mentre "% s" fornisce risultati corretti. – Andrey

0

Poiché la data in mac è calcolata dal 2001 e non dal 1970, dobbiamo aggiungere qualche extra a questa data mac.

978307200000 è equivalente a millisecondi fino 2001-01-01

Inoltre moltiplicando per 1000 è necessaria per convertire in millisecondi.

macDate * 1000 + 978307200000 
0

Non so su come ottenere la data corretta dato due versioni presenti, ma quando ho fatto questo oggi, ho notato la colonna date non era il tempo standard unix ma un numero più con apparentemente nove zeri alla fine, come 444548608000000000. Questo è quello che ho fatto per ottenere la data corretta:

select 
    datetime(substr(date, 1, 9) + 978307200, 'unixepoch', 'localtime') as f_date, 
    text 
from message