Parsing “date” field of iPhone SMS file from backup

萝らか妹 提交于 2019-12-02 19:32:13

Since the backup is exported to SQLite database format, here's how to convert the number to a real date in SQLite:

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

It is in seconds since 1/1/2001 instead of the others which are Unix based off of 1/1/1970. So to convert it to say an Excel time your formula would be =Cell/(60*60*24) + "1/1/2001".

I don't know about getting the correct date given two versions present, but when I did this today, I noticed the date column was not the standard unix time but a longer number with seemingly nine zeros at the end, like 444548608000000000. This is what I did to get the correct date:

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

Apple uses Mac Absolute Time (MacTime). This is counted from 01-01-2001. The other timestamp you see is UnixTime. This starts from 01-01-1970.

You have to add 31 years to MacTime to get UnixTime. This is a PHP-snippit:

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

The time difference is calculated using this website: 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

Jerome

There may be another answer.

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

works with my current version of the iPhone/iOS => 4.3.3

Fomurla with time of messages: =Cell/(60*60*24) + "1/1/2001 7:00"

Since date in mac is calculated from 2001 and not 1970, we have to add some extra to this mac date.

978307200000 is equivalent to milliseconds until 2001-01-01

Also multiplying by 1000 is required to convert to milli-seconds.

macDate * 1000 + 978307200000

Bohemian♦ is right, but there's a little typo in his answer:

use %S (capitals) instead of %s, since the time is represented in seconds since 2001 and not 1970!

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

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

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!