12
votes

Comment le système de données de données de base de l'iPhone SDK stocke-t-il les types de date à SQLite?

J'ai utilisé des données de base pour le faire: xxx

où le champ créé_at est défini comme type "date" dans le xcdatamodel.

Quand j'exporte le SQL de La base de données SQLITE qu'il a créée, créée_at est définie comme type "horodatage" et les valeurs ressemblent:

290902422.72624

neuf chiffres avant le. Et puis une fraction.

Quel est ce format? Ce n'est pas un temps époque et ce n'est pas au format Julianday.

Epoch serait:

1269280338.81213

Julianday serait:

2455278.236746875 (remarquez seulement 7 chiffres avant le. pas 9 comme je avoir)

Comment puis-je convertir un numéro comme 290902422.72624 en époque Time? Merci!


5 commentaires

Tout d'abord, acceptez des réponses .....


Je suis à travers toutes les questions que j'ai posées et cliquée sur la coche à côté des bonnes réponses. Est-ce ce que tu veux dire?


Oui, et n'oubliez pas de continuer. Ce que vous devez faire est d'apprendre le format interne de Nsdate, ce n'est pas nécessairement pomme (exactement) mais les «propriétaires» de l'objectif-c. Découvrez cette information et vous aurez votre réponse.


Dans une autre réponse à une question similaire à celle-ci, la réponse acceptée était de sauvegarder les secondes depuis l'époque dans la DB au lieu d'une nsdate. Cela sera très utile si vous décidez de faire une plate-forme croisée.


Vous pouvez convertir la décimale trouvée dans la SQLite à une date de date réelle en utilisant epochconverter.com/coredata


6 Réponses :


25
votes

5 commentaires

Réponse de Tim souffre de ce dont je parlais, changez votre "référencée" à "l'époque", puis sauvegardez vos dates de cette façon. Lorsque vous commencez à enregistrer vos données à une autre plate-forme, la vie sera beaucoup plus amusante à avoir fait ce changement.


@Kevindtimm: Depuis qu'il utilise des données de base, il sera difficile de convertir des formats de stockage de la date de convertir arbitrairement (à moins que tous les types Nsdate dans son modèle sont commutés sur Nsinteger, ou il passe à SQLite droite).


Je recommanderais de ne pas stocker le Nsdate, en stockant plutôt une nsdecimale de la valeur convertie, puis convertissez-la lors de la récupération. Mais, seulement si vous êtes assez sûr que les données devront être enregistrées sur un serveur central, où elles seront manipulées par d'autres systèmes.


Merci gars c'est exactement ça. Nombre de secondes depuis le 1er janvier 2001, GMT. Le problème ici est ici, je déplace l'application à la cire / Lua ( Github.com/probativementcorey/wax) et n'utilise plus les données de base. J'utilise directement l'API SQLITE, mais je dois honorer toutes les données existantes sur les téléphones de l'utilisateur.


Bonne réponse, et correct. Je suis allé à ce sujet la dure. Les dates de ma base de données (526546800) semblaient être d'environ 1/3 de l'époque actuelle de l'époque. Cela fait également environ 45 ans depuis 1970, j'ai donc supposé avoir utilisé le 1 er janvier 2000. J'ai écrit un certain code pour prendre le TimeInval et générer une date basée sur l'ajout des tiques sur les ticks 1/2000. Celles-ci étaient proches, mais pas assez étroites. S'avère que j'étais une année de congé et que Apple a fourni des fonctions intégrées pour cela.



9
votes

J'ai rencontré un problème connexe d'essayer de comparer la date stockée de données de base à la date stockée MySQL dans une API distante. Ma solution consistait à utiliser les fonctions de date de SQLite pour convertir le temps: xxx pré>

retours: p> xxx pré>

sqlite suppose que la date est en heure locale et la convertit en UTC / GMT. Si vous voulez qu'il reste à l'heure locale, utilisez le modificateur d'heure locale: p>

1269209622


0 commentaires

1
votes

Pour ceux qui sont intéressés par la conversion des dates stockées dans les données de base vers Excel, j'ai proposé cette ForumLa Excel, je pense que c'est bien, cela pourrait être éteint d'une heure avec les trucs GMT si quelqu'un d'autre pourrait confirmer que ce serait cool < / p>

= (A1 / 86400) +35430.042


0 commentaires

0
votes

Si vous essayez d'obtenir les données directement à partir de la ligne de commande SQLITE, vous feriez

Sélectionnez DateTime ('2001-01-01', DateColumn || 'secondes') à partir de la table; ou alors Sélectionnez DateTime ('2001-01-01', DatColumn || 'secondes', 'localtime') de table;


0 commentaires

1
votes

Voici un site Web qui vous permet de coller ces numéros de date et de vous indiquer la date réelle: http: // blog.paddlefish.net/?page_id=90

ou, voici comment lire ces dates SQLite avec ruby: xxx

remplacer 123 < / code> avec la valeur dans la colonne Date.


1 commentaires

Et voici un alias à ajouter à votre .bstrc ou .zshrc: alias coredatatime = 'ruby -e "nécessite \" temps \ "; met le temps.parrse (\" 2001-01-01 00:00:00 - 0000 \ ") + argv [0] .to_i" '. Ensuite, vous pouvez exécuter coredaTatime 418766400 du terminal.



7
votes

Il suffit d'ajouter 978307200 au nombre de données de base et vous obtiendrez un horodatage normal

NSString *coreDataTimestamp =@"464615485.832736"; //string of timestamp in coredata
NSTimeInterval timestamp = [coreDataTimestamp doubleValue] + 978307200;


1 commentaires

Si simple mais génie ;-) merci d'avoir fourni le numéro à ajouter