【发布时间】:2010-12-01 15:49:46
【问题描述】:
我正在编写一个使用核心数据来存储我的数据的应用程序。其中包括一个日期字段,我只对日期而不是时间感兴趣。 我需要根据日期(而不是时间)选择记录,因此我在 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;
}
然后我在向核心数据存储添加数据时使用它(我有一个使用此方法设置原始日期值的设置器),然后我使用此方法创建一个用于比较日期的日期执行获取请求时。所以理论上这应该总是有效的 - 即选择我正在寻找的日期。
我有点紧张,因为我不完全确定更改时区或语言环境会产生什么影响。还能用吗?
仅当您对时间不感兴趣时,才在日期上存储和搜索时被认为是最佳做法。
干杯。
编辑
阅读推荐的讨论后,我认为我应该修改我的代码如下。想法是,如果我确保将其推送到特定的日历系统和特定的时区 (UTC),那么无论您在哪里设置日期和阅读日期,日期都应该始终相同。对此新代码的任何 cmet 表示赞赏。
+ (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)];