5 votes

Quel format utilise la date de la base de données sqlite d'apple notes ?

Je veux extraire les textes des notes et les dates de modification d'une base de données de notes sqlite extraite d'une sauvegarde d'un appareil iOS. Mais je n'arrive pas à trouver comment convertir le format de date en une chaîne de date lisible.

Comment j'ai obtenu les données

J'ai découvert quel fichier contenait les données de la note à partir de cette page .

Portion pertinente :

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 

Ce que j'ai essayé jusqu'à présent

J'ai ouvert le fichier et j'ai confirmé qu'il contenait le corps de texte attendu de la note. Le corps du texte se trouve dans une table appelée ZNOTEBODY . Une autre table appelée ZNOTE a un a ZBODY qui semble contenir des indices dans le ZNOTEBODY et une ZMODIFICATIONDATE colonne. Voici le nœud du problème : Le site ZMODIFICATIONDATE a un type de liste de TIMESTAMP et il contient des nombres à virgule flottante.

J'ai regardé le docs sqlite et j'ai trouvé ça :

SQLite ne dispose pas d'une classe de stockage réservée au stockage des dates et/ou des heures. Au lieu de cela, les fonctions intégrées de date et d'heure de SQLite sont capables de stocker des dates et des heures sous forme de valeurs TEXT, REAL ou INTEGER :

  • TEXTE sous forme de chaînes de caractères ISO8601 ("AAAA-MM-JJ HH:MM:SS.SSS").
  • RÉEL en tant que nombres de jours juliens, le nombre de jours depuis midi à Greenwich le 24 novembre 4714 avant J.-C. selon le calendrier grégorien proleptique.
  • INTEGER comme Unix Time, le nombre de secondes depuis 1970-01-01 00:00:00 UTC.

Les applications peuvent choisir de stocker les dates et les heures dans l'un de ces formats et de les convertir librement à l'aide des fonctions de date et d'heure intégrées.

J'ai donc essayé d'utiliser la fonction intégrée datetime avec une simple fonction SELECT datetime(ZMODIFICATIONDATE) FROM ZNOTE; mais cela a produit des valeurs absurdes comme 1171380-13689427-18 21:08:40 pour une entrée que je sais correspondre à 2014-08-12. La valeur stockée en question était 429559087.38102 .

Alors, quelqu'un sait-il quel format est utilisé ici ? Ou, plus important encore, comment le convertir en une date lisible ?

Les dates enregistrées suivantes correspondent toutes à (différents points sur) 2014-08-11, dans l'ordre du plus tôt au plus tard.

  • 429435093.400244
  • 429446655.298724
  • 429447111.140259
  • 429460783.273032
  • 429464301.184442

(Je ne savais pas trop où poster ceci, mais comme il semble que cela puisse être spécifique à Apple, ceci semblait être le meilleur endroit).

12voto

TN. Points 3450

Según cette réponse sur Stack Overflow, il s'agit d'un timestamp Unix ajusté par 31 ans. C'est typique de CoreData, le framework ORM d'Apple. Ce qui suit fonctionnerait :

select datetime(zmodificationdate,'unixepoch','31 years') from znote

0 votes

Pour ceux qui cherchent des astuces pour interpréter les dates stockées dans sqlite par les applications iOS : certaines applications enregistrent (stupidement) les timestamps en heure locale plutôt qu'en UTC ; dans ce cas, il faut ajouter un paramètre 'localtime' à ce paramètre datetime appeler, par exemple datetime(foo, 'unixepoch', '31 years', 'localtime') - particulièrement délicat pour les utilisateurs britanniques (par exemple) où l'heure locale = = UTC pendant la moitié de l'année mais pas l'autre moitié !

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X