2012-05-24 12 views
10

Chociaż nie jest to pytanie programistyczne jako takie, jest ono powiązane.Parsowanie pola "data" pliku SMS iPhone'a z kopii zapasowej

Więc próbuję dowiedzieć się, jak analizować SMS DB, który jest kopia zapasowa z iPhone. Patrzę na tabelę "komunikatów", w szczególności na pole "data". Zauważyłem, że nowsze wiadomości używają innego systemu numerowania do wskazania daty/czasu. Zawęziłem to do przełącznika na iMessage, ponieważ mam wiadomość wysłaną pod 1318470904, z odpowiedzią wysłaną pod numerem 340164736. Wiem na pewno, że te wiadomości zostały wysłane w odległości mniejszej niż godzina, ale wskazują> 30 lat różnicy.

Ktoś wie, jak dokładnie obliczyć datę przy użyciu tego nowszego systemu? Czy używa innej epoki, czy jest jakaś szalona matematyka, którą muszę zrobić?

Edycja: dotyczy to również ostatnich wiadomości. Teksty (zielone bąbelki) są przechowywane z ustawioną normalnie datą, a wszystko za pośrednictwem iMessage (niebieskie bąbelki) jest przechowywane z inną reprezentacją daty.

+0

Jailbroken, tak? – GoZoner

+0

Nie, to nie jest jailbreak, ani nie było w czasie wiadomości. Dostaję informacje z pliku 3d0d ... w katalogu kopii zapasowych iPhone'a. –

Odpowiedz

7

Jest to w sekundach od 1/1/2001 zamiast innych, które są oparte na Uniksie od 1/1/1970. Tak więc, aby przekonwertować go, aby powiedzieć czas Excel, formuła będzie = Cell/(60 * 60 * 24) + "1/1/2001".

0

Może być inna odpowiedź.

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

prace z mojej obecnej wersji iPhone/iOS => 4.3.3

0

Fomurla z czasem wiadomości: = komórki/(60 * 60 * 24) + „1/1/2001 07:00"

12

Ponieważ kopia zapasowa jest eksportowane do formatu bazy danych SQLite, oto jak do konwersji liczby na prawdziwą randkę w SQLite:

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

Apple używa Mac Absolute Time (MacTime). To jest liczone od 01-01-2001. Innym znacznikiem czasu, który widzisz, jest UnixTime. To zaczyna się od 01-01-1970.

Musisz dodać 31 lat do MacTime, aby uzyskać UnixTime. To jest PHP-snippit:

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

Różnica czasu jest obliczana przy użyciu tej stronie: 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 ♦ jest w porządku, ale jest trochę literówka w jego odpowiedź:

korzystanie% S (wielkie litery) zamiast% s, ponieważ czas reprezentowany jest w sekundach od 2001 r., a nie w 1970 r.!

dokumentu z https://www.sqlite.org/lang_datefunc.html

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

wybrać datetime (data + strftime ('% S', '2001-01-01 00:00:00') 'unixepoch', „localtime ") jako data, * z wiadomości

+1

właśnie wypróbował twój przykład w zapytaniu SQLite i daje niepoprawne wyniki z "% S", a "% s" daje poprawne wyniki. – Andrey

0

Ponieważ data w mac jest obliczana od 2001 r., a nie od 1970 r., musimy dodać trochę więcej do tej daty mac.

978307200000 odpowiada ms aż 2001-01-01

pomnożenie także 1000 jest wymagana do konwersji milisekund.

macDate * 1000 + 978307200000 
0

nie wiem o uzyskanie prawidłowej daty podane dwie wersje obecny, ale gdy zrobiłem to dzisiaj zauważyłem kolumna date nie był standardowy czas uniksowy ale już liczba pozornie dziewięciu zer na koniec, podobnie jak 444548608000000000. To właśnie zrobiłem, aby uzyskać prawidłową datę:

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