我正在编写一个使用核心数据存储数据的应用。其中包括一个日期字段,我只对日期而不是时间感兴趣。 我需要根据日期(而不是时间)选择记录,因此我在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;
}
答案 0 :(得分:5)
这里有一些问题要处理。首先,正如您所说,时区。您还需要担心夏令时,这会改变“中午”的概念。
在CocoaDev上查看this discussion,Apple工程师会给出一些答案并讨论一些最佳实践。
答案 1 :(得分:3)
更简单的解决方案是使用查找某个范围内的日期的谓词。
使用NSCalendarComponent为您创建“day”的开始日期和结束日期,然后将其包含在谓词中。
NSPredicate *p=[NSPredicate predicateWithFormat:@"$@ <= date <= $@",startDate,endDate];
这将提供最大的灵活性,而不会太复杂。编程的日期和时间看似复杂。准备做一些工作。
答案 2 :(得分:2)
我最终还是在需要NSDate
来比较日期而不考虑时间的情况下。
我喜欢过滤器机制,作为UI的一部分,如果用户今天选择最小日期作为开始日期和结束日期为今天,我将显示“所有时间段”而不是格式的字符串:
1/5/2006 - 24/12/2009
因此,我需要使用+date
的{{1}}获取今天的日期,并将其与结束日期进行比较。该结束日期来自NSDate
设置为没有时间,但UIDatePicker
现在返回了日期和时间。
所以我写了这个简短的方法,它接收一个日期对象,使用+date
和NSDateComponents
类来提取日,月和年。
这3个参数随后用于使用NSCalendar
- NSDate
方法创建新的NSDateFormatter's
,结果是dateFromString:
对应于相同的“日期”(在传统的人类概念)作为参数NSDate
,但没有时间。
date
我希望您将来可以使用和享受此功能。