Welches Format verwendet das SQLite-DB-Datum von Apple Notes?

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.

Wie ich an die Daten gekommen bin

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 

Was ich bisher probiert habe

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 ZNOTEhat eine ZBODYSpalte, die Indizes für die ZNOTEBODYTabelle zu enthalten scheint, und eine ZMODIFICATIONDATESpalte. Hier ist der springende Punkt: Die ZMODIFICATIONDATESpalte hat einen aufgelisteten Typ von TIMESTAMPund 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 datetimeFunktion mit einem einfachen, SELECT datetime(ZMODIFICATIONDATE) FROM ZNOTE;aber unsinnigen Wert zu verwenden, wie 1171380-13689427-18 21:08:40fü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.)

Antworten (1)

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
Für andere, die hierher kommen und nach Tipps zum Interpretieren von Datumsangaben suchen, die von iOS-Apps in SQLite gespeichert werden: Einige Apps speichern (dummerweise) Zeitstempel als Ortszeit und nicht als UTC. In diesem Fall müssen Sie 'localtime'diesem datetimeAufruf 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!