题
我一直试图找到存储在iPhone上使用核心数据的日常数据的一个明智的方式。
我的应用程序接收以CSV格式的数据,与日期,但没有时间:
date, cycles
2009-08-01, 123
2009-08-02, 234
2009-08-03, 345
2009-08-04, 456
当该数据被存储时,应该只有每天一个记录。我想这样做的最好的事情是创建一个NSDate要被存储,但去掉了时间和时区数据。
我可以很容易地在不使用任一NSDateComponents或NSDateFormatter小时,分钟或秒创建一个NSDate。但是,即使当我设置时区明确为UTC或从GMT零秒,输出创建日期的NSLog()的总是的有我的本地时区,如:
2009-07-29 00:00:00 +0100
有谁知道一个更好的方式,使NSDates没有时间组件?或者一个存储日期的更好的办法?
解决方案
根据经验,良好的编程规则是总是存储在UTC日期。不要紧,你是否使用核心数据或没有;你仍然必须做一些工作,因为苹果的日期类非常闹心。
日期如因为其是参考日期秒数内部表示,相信,2001年1月1日00:00:00(虽然实际参考日期不是很重要)。重点是,NSDate
对象总是在本地UTC。如果你在CSV文件中获得的日期是本地的,你需要做这样的事情来获得UTC时间:
NSDate *UTCDate = [localDate addTimeInterval:-[[NSTimeZone localTimeZone] secondsFromGMT]];
然后,我的时间设定为00:00:00。现在你节省了时间,在午夜,在UTC。为了表述的目的,您将使用与您所选择的时区配置的NSDateFormatter
(系统时区是默认的,如果你不指定一个)来显示这些日期。
时区不真正的问题,当你只是处理日期,但。只要你一定要设置时区上的NSDateFormatter
为UTC,你总是显示相同的日期,无论用户已经在她的设备上选择哪个时区。
如果你不喜欢这种解决方案,可以随时日期存储在另一种形式。你可以使用一个double
或int
存储在一些自定义格式的日期(例如,因为有一定的参考日期的天数),或者你甚至可以推出自己的类的日期正是你想要的方式进行建模并存储为NSData
宾语。只要类实现NSCoding
,您可以将其序列化到核心数据的NSData
对象。你只需要设置的属性类型,核心数据“可变形”。
您有一吨的选择这里,他们都不涉及编写您自己的SQLite查询和数据库的努力。
其他提示
一个NSDate不具有时区。 NSLog的使用您的本地时区;它说+0100因为这是你在哪里。
在的NSDate对象将总是包含时间日期 - 引用的文档它“表示[秒]的单个时间点”,并通过存储自参考日期(2001年1月1日在GMT开始的时间值这样做,再次根据文档)。因此,你不能有一个NSDate就是不知道一天中的时间。
而不是试图和存储日期自己的路,我会仍然使用NSDate的在你的模型,并考虑将一对方法,你的实体类,其中一个会做上述你的NSDate的设置,以00:00 :00在某一天。另一个可以从一个NSDate您的首选格式只返回日期。然后,这些将使用核心数据生成的获取和设置来访问的NSDate属性。
这是仍在使用的NSDate您使用的是类核心数据可以与本地工作,这意味着你仍然可以按日期使用谓词容易过滤,或排序您获取的成果,而不必太用力去想它。