从备份中解析iPhone SMS文件的“日期”字段

时间:2012-05-24 23:12:55

标签: iphone datetime backup

虽然这本身并不是一个编程问题,但它是相关的。

所以我试图弄清楚如何解析从iPhone备份的SMS数据库。我正在查看“消息”表,特别是“日期”字段。我注意到最近的消息使用不同的编号系统来指示日期/时间。我已将其缩小到切换到iMessage,因为我在1318470904发送了一条消息,并在340164736发送了回复。我知道这些消息发送的时间不到一小时,但它们表示&gt ; 30年的差异。

有人知道如何使用这个较新的系统准确计算日期吗?它是使用不同的时代还是我需要做一些疯狂的数学?

编辑:最近的消息也会受到影响。文本(绿色气泡)与正常设置的日期一起存储,通过iMe​​ssage(蓝色气泡)的任何内容都存储有不同的日期表示。

8 个答案:

答案 0 :(得分:13)

由于备份导出为SQLite数据库格式,以下是如何在SQLite中将数字转换为实际日期:

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

答案 1 :(得分:7)

从1/1/2001开始,这是几秒钟,而不是其他基于Unix的1/1/1970。因此,要将其转换为Excel时间,您的公式将为= Cell /(60 * 60 * 24)+“1/1/2001”。

答案 2 :(得分:5)

我不知道在给出两个版本的情况下获得正确的日期,但是当我今天这样做时,我注意到date列不是标准的unix时间,而是更长的数字,看似九个零最后,像444548608000000000。这就是我为了得到正确的日期而做的事情:

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

答案 3 :(得分:1)

Apple使用Mac绝对时间(MacTime)。这是从01-01-2001算起的。你看到的另一个时间戳是UnixTime。这从01-01-1970开始。

您需要在MacTime上添加31年才能获得UnixTime。这是一个PHP-snippit:

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

使用本网站计算时差: 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

答案 4 :(得分:0)

可能还有另一个答案。

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

适用于我当前版本的iPhone / iOS => 4.3.3

答案 5 :(得分:0)

Fomurla的消息时间: = Cell /(60 * 60 * 24)+“1/1/2001 7:00”

答案 6 :(得分:0)

由于mac中的日期是从2001年而不是1970年计算出来的,因此我们必须在此mac日期中添加一些额外内容。

978307200000相当于2001-01-01之前的毫秒数

还需要乘以1000才能转换为毫秒。

macDate * 1000 + 978307200000

答案 7 :(得分:-1)

波希米亚♦是对的,但他的回答中有一点错字:

使用%S(大写字母)代替%s,因为时间以秒为单位表示,而不是1970年!

来自https://www.sqlite.org/lang_datefunc.html

的文档
%s      seconds since 1970-01-01
%S      seconds: 00-59

选择     datetime(日期+ strftime(' %S ',' 2001-01-01 00:00:00'),        ' unixepoch',' localtime')作为日期,     * 来自消息