代码之家  ›  专栏  ›  技术社区  ›  Andrew Arrow

iphonesdk核心数据系统如何将日期类型存储到sqlite?

  •  12
  • Andrew Arrow  · 技术社区  · 15 年前

    我使用了核心数据:

    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\u at被定义为类型“timestamp”,其值如下所示:

    290902422.72624

    数字前九位。然后是一些分数。

    这是什么格式?这不是纪元时间,也不是朱利安代格式。

    1269280338.81213

    2455278.236746875(请注意,只有7位数字在。不像我那样)

    如何将290902422.72624这样的数字转换为历元时间?谢谢!

    6 回复  |  直到 15 年前
        1
  •  25
  •   Tim    15 年前

    首先,请注意,核心数据文档中说,您永远不应该接触它自己生成的SQL或值—这样做可能会使您的模型在您对其进行更改时失效,而且首先很难解析。

    也就是说,你可能看到的是2001年1月1日格林威治标准时间的日期 NSDate timeIntervalSinceReferenceDate ,使用该时间作为参考。而核心数据则使用 NSDateAttributeType 存储日期类型,该类型定义为NSDate对象。

    通过计算器计算值会产生:

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

    大约是从参考日期起经过的年数。

    如果您真的需要将该值解析回一个epoch时间,那么可以使用该方法 initWithTimeIntervalSinceReferenceDate: 使用SQLite存储的号码获取NSDate,然后调用 timeIntervalSince1970 返回epoch秒(在NSTimeInterval结构中)。

        2
  •  9
  •   kevindayton    15 年前

    我遇到了一个相关的问题,即在远程API中尝试比较核心数据存储日期和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的strftime函数和格式“%s”来获取epoch时间:

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

    退货:

    1269209622
    

        3
  •  7
  •   Andrew Marin    9 年前

    NSString *coreDataTimestamp =@"464615485.832736"; //string of timestamp in coredata
    NSTimeInterval timestamp = [coreDataTimestamp doubleValue] + 978307200;
    
        4
  •  1
  •   Jeremy Wesley    14 年前

    对于那些有兴趣将存储在核心数据中的日期转换为Excel的人,我提出了这个Excel论坛,我认为它是对的,如果其他人能证实这一点,它可能会被GMT的东西关闭一个小时

    =(A1/86400)+35430.042

        5
  •  1
  •   Liron Yahdav    11 年前

    http://blog.paddlefish.net/?page_id=90

    或者,下面是如何使用ruby读取sqlite日期:

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

    123

        6
  •  0
  •   user629328    14 年前

    如果您试图直接从SQLite命令行获取数据,您可以这样做

    从表中选择datetime('2001-01-01',dateColumn | |'秒'); 或 从表中选择datetime('2001-01-01',dateColumn | |'秒','localtime');