我使用核心数据来做到这一点:
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中定义为"Date"类型.
当我从它创建的sqlite数据库导出sql时,created_at被定义为类型"timestamp",值看起来像:
290902422.72624
前九位数.然后是一些分数.
这种格式是什么?这不是纪元时间,也不是julianday格式.
时代将是:
1269280338.81213
julianday将是:
2455278.236746875(通知前只有7位数字.不是像我一样的9位数字)
我怎么能把像290902422.72624这样的数字转换成纪元时间?谢谢!
首先,请注意,Core Data文档说您永远不应该触摸它自己生成的SQL或值 - 如果您对模型进行更改,可能会使模型失效,并且首先难以解析.
那就是说,你可能会看到的是相对于格林尼治标准时间2001年1月1日的日期.NSDate的文档指定单个基本方法timeIntervalSinceReferenceDate
使用该时间作为其引用.反过来,Core Data使用NSDateAttributeType
存储日期类型,日期类型被定义为NSDate对象.
通过计算器运行您的价值会产生:
290902422.72624 / 60 / 60 / 24 / 365.25 = 9.21814...
这是自该参考日期以来经过的年数.
如果你真的需要将该值解析回一个纪元时间,你可以使用initWithTimeIntervalSinceReferenceDate:
你的SQLite存储数字的方法获得一个NSDate,然后调用timeIntervalSince1970
以获取纪元秒(在NSTimeInterval结构中).
我遇到了一个相关的问题,试图在远程API中将Core Data存储日期与MySQL存储日期进行比较.我的解决方案是使用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
这显示了我本地TZ的-0500偏移量.
在此基础上,您可以使用SQLite的格式为'%s'的strftime函数来获取时间:
SELECT strftime('%s',datetime('2001-01-01','+290902422.72624 second'));
返回:
1269209622
我希望这有帮助.
只需将978307200添加到核心数据中的数字,即可获得正常的时间戳
NSString *coreDataTimestamp =@"464615485.832736"; //string of timestamp in coredata NSTimeInterval timestamp = [coreDataTimestamp doubleValue] + 978307200;