我正在编写一个使用核心数据存储我的数据的应用程序。包括在这个日期字段中,我只对日期不感兴趣。 我需要根据日期(不是时间)来选择记录,所以我已经创建了的NSDate类别返回日期,标准化为一组时间如下:NSDate创建没有时间元素的日期的最佳做法
+ (NSDate *)dateWithNoTime:(NSDate *)dateTime {
if(dateTime == nil) {
dateTime = [NSDate date];
}
NSDateComponents* comps = [[NSCalendar currentCalendar] components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:dateTime];
NSDate *dateOnly = [[NSCalendar currentCalendar] dateFromComponents:comps];
[dateOnly dateByAddingTimeInterval:(60.0 * 60.0 * 12.0)]; // Push to Middle of day.
return dateOnly;
}
然后我当我将数据添加到核心数据存储(我有一个使用此方法设置原始日期值的setter)时使用此方法,然后使用此方法创建一个日期,用于比较执行提取请求时的日期。所以理论上这应该总是有效的 - 也就是选出我要找的日期。
虽然我不完全确定改变时区或区域设置会产生什么效果,但我略感紧张。它会继续工作吗?
只有当您对时间没有兴趣时,才能在日期上存储和搜索时被认为是最佳实践。
干杯。
编辑
阅读讨论后建议我认为我应该修改我的代码如下。我的想法是,如果我确保将其推送到特定的日历系统和特定的时区(UTC),那么日期应始终保持不变,无论您设置日期和阅读日期时的位置。对这个新代码的任何评论表示赞赏。
+ (NSDate *)dateWithNoTime:(NSDate *)dateTime {
if(dateTime == nil) {
dateTime = [NSDate date];
}
NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
[calendar setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease];
components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit
fromDate:dateTime];
NSDate *dateOnly = [calendar dateFromComponents:components];
[dateOnly dateByAddingTimeInterval:(60.0 * 60.0 * 12.0)]; // Push to Middle of day.
return dateOnly;
}
感谢您的解决方案! :d 只是一个小的校正: 线: `[dateOnly dateByAddingTimeInterval:(60.0 * 60.0 * 12.0)];` 应该是: `dateOnly = [dateOnly dateByAddingTimeInterval:(60.0 * 60.0 * 12.0)];` – 2016-03-02 20:01:29