2010-03-22 43 views
12

我使用的核心數據要做到這一點:iPhone SDK核心數據系統如何將日期類型存儲到sqlite?

NSManagedObjectContext *m = [self managedObjectContext]; 
Foo *f = (Foo *)[NSEntityDescription insertNewObjectForEntityForName:@"Foo" 
                 inManagedObjectContext:m]; 
f.created_at = [NSDate date]; 
[m insertObject:f]; 

NSError *error; 
[m save:&error]; 

凡created_at字段被定義爲xcdatamodel型「日期」。

當我出口從它創建的SQLite數據庫的SQL,created_at被定義爲類型「時間戳」和值如下所示:前

290902422.72624

九位數。然後是一些分數。

什麼是這種格式?這不是紀元時間,也不是朱莉婭格式。

時代將是:

1269280338.81213

儒略日將是:(之前通知只有7個位數不是9像我有)

2455278.236746875

我如何將數字轉換像290902422.72624到時代?謝謝!

+0

第一,接受一些答案..... – KevinDTimm 2010-03-22 17:57:43

+0

我什麼時候通了所有的問題,我問,並點擊複選標記旁邊的好答案。那是你的意思嗎? – 2010-03-22 18:08:08

+0

是的,不要忘記繼續。你需要做的是學習NSDate的內部格式,這不一定是Apple(完全),而是Objective-C的'擁有者'。找出這些信息,你會得到你的答案。 – KevinDTimm 2010-03-22 18:15:22

回答

25

首先,請注意,核心數據文檔說明您不應該觸摸自己生成的SQL或值 - 如果您對模型進行了更改,則可能會使模型無效,並且很難在第一名。

也就是說,您可能會看到的是相對於格林威治標準時間2001年1月1日的日期。 NSDate的文檔指定單一基本方法timeIntervalSinceReferenceDate使用該時間作爲參考。核心數據反過來使用NSDateAttributeType來存儲日期類型,它被定義爲一個NSDate對象。

通過計算器運行你的價值產生:

290902422.72624/60/60/24/365.25 = 9.21814...

這大約是因爲該基準日是的耗用的年數。

如果你真的需要解析值回一個劃時代的時間,你可以使用的方法initWithTimeIntervalSinceReferenceDate:與SQLite的存儲數量來獲得一個NSDate,然後調用timeIntervalSince1970得到劃時代秒回(在NSTimeInterval結構)。

+0

添的回答aludes在源碼中找到的十進制轉換爲真正的約會時間,我在說什麼,你的「referenceDate」更改爲「時代」,然後這樣保存你的日期。當你開始將數據保存到另一個平臺上時,進行這種更改會使生活變得更加有趣。 – KevinDTimm 2010-03-22 18:21:57

+0

@kevindtimm:因爲他使用的核心數據,這會是困難的,只是隨意轉換日期存儲格式(除非所有的NSDate類型在他的模型中獲取切換到NSInteger的,或者他切換到直SQLite的)。 – Tim 2010-03-22 18:23:37

+0

我會建議不存儲NSDate,而是存儲轉換後的值的NSDecimal,然後在檢索時轉換回來。但是,只有當你確信數據需要保存到中央服務器時,它纔會被其他系統操縱。 – KevinDTimm 2010-03-22 18:26:10

8

我遇到了一個相關的問題,試圖比較核心數據存儲日期和MySQL存儲日期在遠程API。我的解決辦法是使用SQLite的日期函數將時間轉換:

SELECT datetime('2001-01-01','+290902422.72624 second'); 

返回:

2010-03-21 22:13:42 

的SQLite假定日期爲本地時間並將其轉換爲UTC/GMT。如果你想讓它留在本地時間,使用本地時間修改:

SELECT datetime('2001-01-01','+296662599 second','localtime'); 

返回:

2010-03-21 17:13:42 

這說明-0500對於我的本地TZ偏移。

建設上,你可以使用SQLite的strftime函數與格式 '%s' 來獲得劃時代的時間回:

SELECT strftime('%s',datetime('2001-01-01','+290902422.72624 second')); 

返回:

1269209622 

我希望這有助於。

1

對於那些有興趣將存儲在覈心數據到Excel日期,我想出了這個Excel forumla,我認爲它的權利,它可能通過與GMT東西,一小時之內關閉,如果有人可以證實,這將是很酷

=(A1/86400)35430.042

0

如果你想直接從SQLite的命令行獲得的數據,你會做

選擇日期時間( '2001-01-01', dateColumn ||'seconds')from table; 或 選擇日期時間( '2001-01-01',dateColumn || '秒', '本地時間')從表;

1

這裏有一個網站,讓你貼的日期數字,並顯示您的實際日期:http://blog.paddlefish.net/?page_id=90

或者說,這裏是如何讀取紅寶石那些源碼日期:

ruby -e "require 'time'; puts Time.parse('2001-01-01 00:00:00 -0000') + 123" 

更換123與價值在日期欄中。

+0

這是一個添加到.bashrc或.zshrc的別名:'alias coredatatime ='ruby -e「require \」time \「; puts Time.parse(\」2001-01-01 00:00:00 -0000 \「)+ ARGV [0] .to_i」''。然後你可以從終端運行'coredatatime 418766400'。 – 2014-04-09 21:25:25

6

只需添加978307200爲數字核心數據,你會得到正常的時間戳

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

這麼簡單,但天才;-)感謝您提供的號碼添加 – 2015-12-09 13:28:16

相關問題