Разбор "даты" поля 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') в качестве даты,   * из сообщения