虽然这本身并不是一个编程问题,但它是相关的。
所以我试图弄清楚如何解析从iPhone备份的SMS数据库。我正在查看“消息”表,特别是“日期”字段。我注意到最近的消息使用不同的编号系统来指示日期/时间。我已将其缩小到切换到iMessage,因为我在1318470904发送了一条消息,并在340164736发送了回复。我知道这些消息发送的时间不到一小时,但它们表示&gt ; 30年的差异。
有人知道如何使用这个较新的系统准确计算日期吗?它是使用不同的时代还是我需要做一些疯狂的数学?
编辑:最近的消息也会受到影响。文本(绿色气泡)与正常设置的日期一起存储,通过iMessage(蓝色气泡)的任何内容都存储有不同的日期表示。
答案 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);
答案 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')作为日期, * 来自消息