Какой формат использует дата apple note sqlite db?

Я хочу извлечь тексты заметок и даты модификации из базы данных заметок sqlite, извлеченной из резервной копии устройства iOS. Но я не могу понять, как преобразовать формат даты в удобочитаемую строку даты.

Как я получил данные

Я узнал, в каком файле были данные заметки с этой страницы .

Соответствующая часть:

Step 1. Find the Backup File in ~/Library/Application Support/MobileSync/Backup/fea….627
        something like : ca3b….39c
       If you have trouble seeing Library folder 
       defaults write com.apple.Finder AppleShowAllFiles Yes
Step 2. Copy file and rename as notes.sqlite 

Что я пробовал до сих пор

Я открыл файл и убедился, что в нем есть ожидаемый основной текст заметки. Основной текст находится внутри таблицы с именем ZNOTEBODY. Другая таблица с именем ZNOTEимеет ZBODYстолбец, который, по-видимому, содержит индексы в ZNOTEBODYтаблице, и ZMODIFICATIONDATEстолбец. Вот суть дела: столбец ZMODIFICATIONDATEимеет перечисленный тип TIMESTAMPи содержит числа с плавающей запятой.

Я просмотрел документы sqlite и нашел это:

SQLite не имеет класса хранения, выделенного для хранения дат и/или времени. Вместо этого встроенные функции даты и времени SQLite способны хранить даты и время в виде значений TEXT, REAL или INTEGER:

  • ТЕКСТ в виде строк ISO8601 ("ГГГГ-ММ-ДД ЧЧ:ММ:СС.ССС").
  • НАСТОЯЩЕЕ число дней по юлианскому календарю, количество дней, прошедших с полудня по Гринвичу 24 ноября 4714 г. до н.э. по пролептическому григорианскому календарю.
  • INTEGER как время Unix, количество секунд, прошедших с 1970-01-01 00:00:00 UTC.

Приложения могут хранить дату и время в любом из этих форматов и свободно конвертировать между форматами, используя встроенные функции даты и времени.

Поэтому я попытался использовать встроенную datetimeфункцию с простым, SELECT datetime(ZMODIFICATIONDATE) FROM ZNOTE;но это привело к бессмысленным значениям, например, 1171380-13689427-18 21:08:40для записи, которая, как я знаю, соответствует 2014-08-12. Сохраненное значение, о котором идет речь, было 429559087.38102.

Итак, кто-нибудь знает, какой формат здесь используется? Или, что более важно, как преобразовать его в удобочитаемую дату?

Все следующие сохраненные даты соответствуют (разные точки) 11 августа 2014 г. в порядке от самой ранней до самой поздней.

  • 429435093.400244
  • 429446655.298724
  • 429447111.140259
  • 429460783.273032
  • 429464301.184442

(Я не знал, где опубликовать это, но, поскольку кажется, что это может быть специфично для Apple, это показалось лучшим местом.)

Ответы (1)

Согласно этому ответу на Stack Overflow, это временная метка Unix, скорректированная на 31 год. Это типично для CoreData, платформы Apple ORM. Следующее будет работать:

select datetime(zmodificationdate,'unixepoch','31 years') from znote
Для других, которые приходят сюда в поисках советов по интерпретации дат, хранящихся в sqlite приложениями iOS: некоторые приложения (глупо) сохраняют временные метки как местное время, а не UTC; в этом случае вам нужно добавить 'localtime'параметр к этому datetimeвызову, например datetime(foo, 'unixepoch', '31 years', 'localtime')- особенно сложно для пользователей из Великобритании (скажем), где местное время == UTC для половины года, но не для другой половины!