Я хочу извлечь тексты заметок и даты модификации из базы данных заметок 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, это показалось лучшим местом.)
Согласно этому ответу на Stack Overflow, это временная метка Unix, скорректированная на 31 год. Это типично для CoreData, платформы Apple ORM. Следующее будет работать:
select datetime(zmodificationdate,'unixepoch','31 years') from znote
карликовая земля
'localtime'
параметр к этомуdatetime
вызову, напримерdatetime(foo, 'unixepoch', '31 years', 'localtime')
- особенно сложно для пользователей из Великобритании (скажем), где местное время == UTC для половины года, но не для другой половины!