核心数据保存DatePicker值

时间:2014-02-04 01:52:48

标签: ios objective-c xcode core-data

所以我有2个实体都带有NSDate属性。我的“OwedMoney”实体具有“youOweDate”NSDate属性,而我的“TheyOweMoney”实体具有“dueDate”NSDate属性。在两个View控制器上,我有一个UIDatePicker类型Date。所以它只显示月,日和年。下面的代码中我尝试保存DatePicker的日期值。我的DatePicker的名字是“personWhoOwesYouDueDate”

    NSDate *choice = [personWhoOwesYouDueDate date];

NSManagedObjectContext *context =  [self managedObjectContext];
TheyOweMoney *owedMoney = [NSEntityDescription insertNewObjectForEntityForName:@"TheyOweMoney" inManagedObjectContext:context];
[owedMoney setValue:choice forKey:@"dueDate"];

然后我有一个NSLog来检查值

NSLog(@"%@", choice);

因此,当我的应用程序加载并且我选择了像2014年2月8日这样的日期时,我没有得到预期的结果

输入日期:2014年2月8日

结果:2014-02-09 01:50:29 +0000

所以它有年和月正确,但这一天是错的。还有,有办法摆脱“+0000”部分?真的很烦人。另一件事是我的日期值不能是一个字符串,因为当我将它的值设置为属性时,它必须是NSDate的一个实例。

感谢所有帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

如果UIDatePicker的模式是UIDatePickerModeDate,它允许您选择日,月和年信息,但NSDate也有时间组件。因此[personWhoOwesYouDueDate date]将为您提供一个NSDate,其中包含所选组件和当前时间的时间组件(在本例中为01:50:29)。如果您希望存储2014-02-08 00:00:00,请执行以下操作:

NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
cal.timeZone = [NSTimeZone systemTimeZone];
cal.locale = [NSLocale currentLocale];
NSDateComponents *dateComponents = [cal components: NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate: [personWhoOwesYouDueDate date]];
[owedMoney setValue:[cal dateFromComponents: dateComponents] forKey:@"dueDate"];

@rdelmar:NSDate不存储任何timezon信息。所以它不是基于任何时区。当记录NSDate时,时区才会发挥作用,NSDate将显示基于GMT的日期“移位”到时区集。