Ich möchte die Notiztexte und Änderungsdaten aus einer SQLite-Notizendatenbank extrahieren, die aus einer iOS-Gerätesicherung extrahiert wurde. Aber ich kann nicht herausfinden, wie ich das Datumsformat in eine lesbare Datumszeichenfolge konvertieren kann.
Ich habe von dieser Seite herausgefunden, welche Datei die Notizdaten enthält .
Relevanter Teil:
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
Ich habe die Datei geöffnet und bestätigt, dass sie den erwarteten Notiztext enthält. Der Haupttext befindet sich in einer Tabelle namens ZNOTEBODY
. Eine andere Tabelle mit dem Namen ZNOTE
hat eine ZBODY
Spalte, die Indizes für die ZNOTEBODY
Tabelle zu enthalten scheint, und eine ZMODIFICATIONDATE
Spalte. Hier ist der springende Punkt: Die ZMODIFICATIONDATE
Spalte hat einen aufgelisteten Typ von TIMESTAMP
und enthält Gleitkommazahlen.
Ich habe mir die SQLite-Dokumente angesehen und Folgendes gefunden:
SQLite hat keine Speicherklasse, die zum Speichern von Daten und/oder Zeiten vorgesehen ist. Stattdessen können die integrierten Datums- und Zeitfunktionen von SQLite Datums- und Zeitangaben als TEXT-, REAL- oder INTEGER-Werte speichern:
- TEXT als ISO8601-Strings ("YYYY-MM-DD HH:MM:SS.SSS").
- REAL als julianische Tageszahlen, die Anzahl der Tage seit Mittag in Greenwich am 24. November 4714 v. Chr. nach dem proleptischen gregorianischen Kalender.
- INTEGER als Unix Time, die Anzahl der Sekunden seit dem 01.01.1970 00:00:00 UTC.
Anwendungen können Daten und Zeiten in einem dieser Formate speichern und mithilfe der integrierten Datums- und Zeitfunktionen frei zwischen den Formaten konvertieren.
Also habe ich versucht, die eingebaute datetime
Funktion mit einem einfachen, SELECT datetime(ZMODIFICATIONDATE) FROM ZNOTE;
aber unsinnigen Wert zu verwenden, wie 1171380-13689427-18 21:08:40
für einen Eintrag, von dem ich weiß, dass er dem 12.08.2014 entspricht. Der betreffende gespeicherte Wert war 429559087.38102
.
Weiß jemand, welches Format hier verwendet wird? Oder, was noch wichtiger ist, wie kann man es in ein lesbares Datum umwandeln?
Die folgenden gespeicherten Daten entsprechen alle dem (verschiedenen Zeitpunkt) 2014-08-11, in der Reihenfolge vom frühesten bis zum spätesten.
429435093.400244
429446655.298724
429447111.140259
429460783.273032
429464301.184442
(Ich war mir nicht sicher, wo ich das posten sollte, aber da es so aussieht, als wäre es Apple-spezifisch, schien dies der beste Ort zu sein.)
Laut dieser Antwort auf Stack Overflow handelt es sich um einen um 31 Jahre angepassten Unix-Zeitstempel. Dies ist typisch für CoreData, das ORM-Framework von Apple. Folgendes würde funktionieren:
select datetime(zmodificationdate,'unixepoch','31 years') from znote
Gimboland
'localtime'
diesemdatetime
Aufruf einen Parameter hinzufügen, z. B.datetime(foo, 'unixepoch', '31 years', 'localtime')
- besonders schwierig für Benutzer in Großbritannien (sagen wir), wo Ortszeit == UTC für die Hälfte des Jahres, aber nicht für die andere Hälfte!