Разбор "даты" поля iPhone SMS файла из резервной копии
Хотя это не вопрос программирования как таковой, он связан.
Итак, я пытаюсь понять, как разбирать БД SMS, которая подкрепляется с iPhone. Я смотрю таблицу "сообщений", в частности поле "дата". Я заметил, что в последних сообщениях используется другая система нумерации для указания даты/времени. Я сузил его до переключателя на iMessage, так как у меня есть сообщение, отправленное по номеру 1318470904, с ответом, отправленным по адресу 340164736. Я знаю, что эти сообщения отправляются менее часа друг от друга, но они указывают > 30 лет.
Кто-нибудь знает, как точно рассчитать дату, используя эту новую систему? Используется ли другая эпоха или есть какая-то сумасшедшая математика, которую мне нужно делать?
Изменить. Недавние сообщения также затронуты. Тексты (зеленые пузырьки) сохраняются с установленной датой, и что-либо через iMessage (синие пузырьки) сохраняется с другим представлением даты.
Ответы
Ответ 1
Поскольку резервная копия экспортируется в формат базы данных SQLite, здесь, как преобразовать номер в реальную дату в SQLite:
select
datetime(date + strftime('%s', '2001-01-01 00:00:00'),
'unixepoch', 'localtime') as date,
*
from message
Ответ 2
Это за секунды с 1 января 2001 года, а не за остальные, которые Unix основаны на 1/1/1970. Поэтому, чтобы преобразовать его, чтобы сказать время Excel, ваша формула будет = Cell/(60 * 60 * 24) + "1/1/2001".
Ответ 3
Я не знаю, как получить правильную дату, учитывая две версии, но когда я это сделал сегодня, я заметил, что столбец date
не был стандартным временем unix, а более длинным числом с девятью нулями в конце, как 444548608000000000
. Это то, что я сделал, чтобы получить правильную дату:
select
datetime(substr(date, 1, 9) + 978307200, 'unixepoch', 'localtime') as f_date,
text
from message
Ответ 4
Apple использует Mac Absolute Time (MacTime). Это считается с 01-01-2001. Другая временная метка, которую вы видите, - UnixTime. Это начинается с 01-01-1970.
Вы должны добавить 31 год в MacTime, чтобы получить 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
Ответ 5
Может быть другой ответ.
=Cell/(60*60*24) + "1/1/1970"
работает с моей текущей версией iPhone/iOS = > 4.3.3
Ответ 6
Fomurla со временем сообщений:
= Cell/(60 * 60 * 24) + "1/1/2001 7:00"
Ответ 7
Поскольку дата в mac вычисляется с 2001 года, а не с 1970 года, мы должны добавить некоторые дополнительные данные в эту дату.
978307200000 эквивалентен миллисекундам до 2001-01-01
Также для преобразования в миллисекунд требуется умножение на 1000.
macDate * 1000 + 978307200000
Ответ 8
как даже ввести коды? новичок здесь
Ответ 9
Богемский ♦ прав, но в его ответе немного опечатки:
используйте% S (capitals) вместо% s, так как время представлено в секундах с 2001 года, а не 1970!
Doc из 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') в качестве даты, *
из сообщения